[英]python: What happens when class attribute, instance attribute, and method all have the same name?
[英]Python: Same name for class method parameters and class attribute
我有一个课堂作业。 我的任务之一如下:
a. 通过添加新属性hunger
增强 Tribute 类,该属性将描述 Tribute 的饥饿程度。 hunger
的初始值应为 0,因为所有贡品都会以饱腹感开始游戏。
湾创建一个方法get_hunger()
,它返回贡品的当前饥饿程度。
C. 创建一个方法add_hunger(hunger)
,它将为 Tribute 的饥饿值添加一个饥饿值。 当 Tribute 的饥饿值等于或大于 100 时,他/她将go_to_heaven()
。 (仅供参考go_to_heaven()
之前由其他父类定义)
1)我编写了以下代码,当我尝试运行它时,我一直在
self.get_hunger()+=hunger
之前的缩进中突出显示语法错误。 我可以知道语法错误的原因,因为.get_hunger()
本质上是self.hunger
。self.get_hunger()=0
将适用于此任务之后的其他代码,但我不明白为什么self.get_hunger()+=hunger
不起作用。 我的讲师强调不打破抽象的底层,这就是为什么我会使用.get_hunger()
方法.get_hunger()
不是属性hunger
,特别是如果我需要从未来的 Tribute 子类的实例中获取饥饿值,不确定这个概念是否在实际情况中也被接受。
class Tribute(Person):
def __init__(self, name, health):
super().__init__(name, health, -1)
self.hunger=0
def get_hunger(self):
return self.hunger
def add_hunger(self,hunger):
self.get_hunger()+=hunger #dk why can't assign to function call
if self.get_hunger()>=100:
self.go_to_heaven()
2)我也尝试编写
self.hunger+=hunger
而不是self.get_hunger()+=hunger
来解决语法错误并且它有效。但是,我不觉得为什么在定义类方法时很直观,当我面对方法参数名称和类属性名称相同的场景,参数不会以hunger
的形式覆盖属性。 谁能跟我讲道理?
对变量执行赋值。 这就是 Python 的工作方式。 变量是对内存中对象的引用。
函数调用返回对象,并且不能分配给对象。
我建议使用 setter 方法来处理抽象的另一面。
class Tribute(Person):
...
def get_hunger(self):
return self.hunger
def set_hunger(self, hunger):
self.hunger = hunger
def add_hunger(self,hunger):
self.set_hunger(self.get_hunger() + hunger)
if self.get_hunger() >= 100:
self.go_to_heaven()
看起来您已经有了抽象,因为您正在使用一种方法来增加类字段add_hunger()
并在内部进行健康检查。 不在它自己的方法中直接使用 class 字段似乎没有多大意义。
您无法使用self.get_hunger()
方法访问类字段self.hunger
。
您的方法self.get_hunger()
返回self.hunger
值(它的副本),而不是变量本身。 因此,您可以向该值添加任何数字,但您需要将其写在某处以保持其值。 因此,当您运行self.get_hunger()+=hunger
您的方法会返回self.hunger
的副本,从参数中添加hunger
,然后该副本丢失,但self.hunger
是相同的。
所以,如果你想增加self.hunger
- 你只需要使用self.hunger+=hunger
,你已经检查过了。
如果您使用按引用而不是按值传递的变量类型,它实际上会起作用。 就像这个例子中的 list ,但我想说这是一种变态的方式。 ;)
class Tribute(Person): def __init__(self, name, health): super().__init__(name, health, -1) self.hunger=[0] def get_hunger(self): return self.hunger def add_hunger(self,hunger): self.get_hunger()[0]+=hunger # dk why can't assign to function call if self.get_hunger()[0]>=100: self.go_to_heaven()
对不同的事物使用相同的名称是不好的。 它可能会导致一些错误。 即使其中一个是可变的,另一个是方法。 如果您稍后尝试将该方法传递给某个线程 - 它永远不会知道您在那里传递的是哪个。 如果所有名称都不同 - 它更安全且更具可读性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.