Python:类方法参数和类属性的名称相同

时间:2018-04-16 01:05:45

标签: python python-3.x class

我上课了。我的任务之一如下:

一个。通过添加将描述的新属性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.hungerself.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的形式覆盖该属性。谁能跟我说理?

2 个答案:

答案 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)对于不同的东西使用相同的名称并不好。它可能会导致一些错误。即使其中一个是可变的,另一个是方法。如果您稍后尝试将该方法传递给某个线程 - 它将永远不会知道您正在那里传递哪个。如果所有名称都不同 - 它是安全的,更具可读性。