Python:理解类和实例变量

标签 python

我想我对类和实例变量有一些误解。这是一个示例代码:

class Animal(object):
    energy = 10
    skills = []

    def work(self):
        print 'I do something'
        self.energy -= 1

    def new_skill(self, skill):
        self.skills.append(skill)


if __name__ == '__main__':

    a1 = Animal()
    a2 = Animal()

    a1.work()
    print a1.energy  # result:9
    print a2.energy  # result:10


    a1.new_skill('bark')
    a2.new_skill('sleep')
    print a1.skills  # result:['bark', 'sleep']
    print a2.skills  # result:['bark', 'sleep']

我认为 energyskill 是类变量,因为我在任何方法中都声明了它们。我以相同的方式在方法中修改它的值(在他的声明中使用 self,可能不正确?)。但结果告诉我 energy 为每个对象采用不同的值(如实例变量),而 skills 似乎是共享的(如类变量)。我想我错过了一些重要的事情......

最佳答案

这里的诀窍在于了解 self.energy -= 1 的作用。这真的是两种表达方式;一个获取 self.energy - 1 的值,另一个将其分配回 self.energy

但让您感到困惑的是,在该分配的两侧,引用的解释方式不同。当 Python 被告知要获取 self.energy 时,它会尝试在实例上找到该属性,但失败了,然后回退到类属性。但是,当它分配给 self.energy 时,它总是会分配给一个实例属性,即使它以前不存在。

关于Python:理解类和实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35766834/

相关文章:

Python "ImportError: No module named...",但模块存在

python - 为什么我的 wxPython 小部件的格式会出现问题?

python - SKlearn SGD 部分拟合

python - mousePressEvent 不适用于子部件?

python - 在 Django 中,可以将 Model.objects 设置为模型定义之外的另一个管理器吗?

python - AttributeError : 'Function' object has no attribute. 无法调用另一个函数的属性

python - 从 python 中的文件解析

用于将文件转换为 MP3 并设置其质量的 Python 库

python - csv.writer 出现 UnicodeEncodeError

python - 在字典列表中查找最常出现的字典的最佳方法