【问题标题】:Class variable and instance variable question in PythonPython中的类变量和实例变量问题
【发布时间】:2011-06-10 18:24:53
【问题描述】:

当我有这个类时,变量“值”是类变量。

class Hello:
    value = 10
    def __init__(self):
        print 'init'

我有一个对象“h”,对于 Hello.value 和 h.value,我可以得到相同的值“10”。

h = Hello()
print Hello.value
print h.value

当我运行这个命令时,

h.value = 20

当我运行它们时,我得到值“10”和“20”。

print Hello.value
print h.value

这是为什么?

  • Q1:为什么 'print h.value' 打印出 Hello.value 的值,而不是引发错误?
  • Q2:h.value = 20 是否引入了类似于 'self.value = 20' 的新变量?
  • Q3:有没有办法阻止创建实例变量(或阻止运行代码'h.value = 20')?

【问题讨论】:

    标签: python instance-variables class-variables


    【解决方案1】:

    这就是 Python 中属性查找的工作原理:

    1. 如果在实例的字典中找不到属性,则在其类的字典中查找,如果在其中找不到,也在基类的字典中查找.

    2. 如果您分配给实例属性,这将始终只影响实例 - 即如果该属性已存在于实例中,则更新该属性,否则在实例的字典中创建它。

      李>

    如果您不喜欢这种行为,您可以覆盖__setattr__() 方法来做任何您喜欢的事情——例如,如果您不想允许创建实例属性,则抛出错误。后者也可以通过在类中添加__slots__ = []来实现。

    【讨论】:

      【解决方案2】:

      如果 Python 查找 o.attr,它首先检查对象实例,然后是它的类,然后是基类,依此类推。它对方法和数据属性都这样做(即数据和代码属性之间没有区别)。

      在分配时,值总是被分配给实例。所以

      • A1。因为它回落到 类(它必须,因为方法 否则将无法工作)

      • A2。是的,确实如此。

      • A3。你可以定义一个__setattr__ 引发异常的方法。

      【讨论】:

        猜你喜欢
        • 2012-01-31
        • 1970-01-01
        • 2022-08-11
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        • 2018-08-26
        • 1970-01-01
        相关资源
        最近更新 更多