我上课了。我的任务之一如下:
一个。通过添加将描述的新属性hunger
来扩充Tribute类
贡品的饥饿程度。 hunger
的初始值应为0
Tributes将全力以赴开始游戏。
湾创建一个方法get_hunger()
,它返回当前的致敬饥饿程度。
℃。创建一个方法add_hunger(hunger)
,它将为Tribute添加一个饥饿值
饥饿。当贡品的饥饿等于或超过100时,他/她会
go_to_heaven()
。 (FYI go_to_heaven()
先前由其他父类定义)
1)我编写了以下代码,当我尝试运行它时,我一直在
self.get_hunger()+=hunger
之前的缩进上突出显示语法错误。我可以知道语法错误的原因,因为.get_hunger()
基本上是self.hunger
。self.get_hunger()=0
将适用于执行此任务的其他代码,但我不明白为什么self.get_hunger()+=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
的形式覆盖该属性。谁能跟我说理?
答案 0 :(得分:2)
在变量上执行赋值,这就是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()
答案 1 :(得分:1)
1)看起来你已经有了抽象,因为你正在使用一种方法来增加带有健康检查的类字段add_hunger()
。不直接在其内部使用类字段,它自己的方法似乎没有多大意义。
2)您无法使用方法self.hunger
访问班级字段self.get_hunger()
。
您的方法self.get_hunger()
返回self.hunger
(它的副本)的值,但不返回变量本身。因此,您可以向该值添加任意数字,但您需要将其写入某处以保持其值。因此,当您运行self.get_hunger()+=hunger
时,您的方法会返回self.hunger
的副本,从参数中添加hunger
,然后此副本会丢失,但self.hunger
是相同的。
所以,如果你想增加self.hunger
- 你只需要使用已经检查过的self.hunger+=hunger
。
3)如果您使用由referance而不是value传递的变量类型,它实际上会起作用。就像这个例子中的列表一样,但我会说这是一种变态的方式。 ;)
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()
4)对于不同的东西使用相同的名称并不好。它可能会导致一些错误。即使其中一个是可变的,另一个是方法。如果您稍后尝试将该方法传递给某个线程 - 它将永远不会知道您正在那里传递哪个。如果所有名称都不同 - 它是安全的,更具可读性。