繁体   English   中英

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

[英]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()
  1. 看起来您已经有了抽象,因为您正在使用一种方法来增加类字段add_hunger()并在内部进行健康检查。 不在它自己的方法中直接使用 class 字段似乎没有多大意义。

  2. 您无法使用self.get_hunger()方法访问类字段self.hunger

    您的方法self.get_hunger()返回self.hunger值(它的副本),而不是变量本身。 因此,您可以向该值添加任何数字,但您需要将其写在某处以保持其值。 因此,当您运行self.get_hunger()+=hunger您的方法会返回self.hunger的副本,从参数中添加hunger ,然后该副本丢失,但self.hunger是相同的。

    所以,如果你想增加self.hunger - 你只需要使用self.hunger+=hunger ,你已经检查过了。

  3. 如果您使用按引用而不是按值传递的变量类型,它实际上会起作用。 就像这个例子中的 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()
  4. 对不同的事物使用相同的名称是不好的。 它可能会导致一些错误。 即使其中一个是可变的,另一个是方法。 如果您稍后尝试将该方法传递给某个线程 - 它永远不会知道您在那里传递的是哪个。 如果所有名称都不同 - 它更安全且更具可读性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM