为什么我可以为类实例分配属性,即使这个属性没有在类中定义?

时间:2015-05-06 12:11:42

标签: python class

这背后是什么样的机制?

例如,我可以定义一个类

class test:
    string_a="aaa"

然后我可以为类测试设置一个实例。

test_instance=test()

稍后我可以为test_instance分配test_attr

test_instance.test_attr="bbb"
print test_instance.test_attr

这将打印"bbb"

那么行为是什么?与__init__冲突的任何事情?

感谢。

1 个答案:

答案 0 :(得分:0)

这里有两件事:

  1. 类属性
  2. 实例属性
  3. 区分差异很重要。

    类属性,如:

    class A:
        a = 1
    
    每次创建的实例都会保留

    。那就是:

    a = A()
    b = A()
    a.a == b.a  # True
    

    实例属性通常由名为__setattr__魔术方法访问(设置)和__getattr__检索他们)。

    所有类的实例(除非您使用__slots__)都有一个名为__dict__的内部字典。您不必在类上“声明”属性,以便在实例上设置它们。

    阅读Python Data Model