Python 2.7 OOP中实例变量的奇怪行为

Python 2.7 OOP中实例变量的奇怪行为,python,Python,我的代码: >>> class Class1: pass >>> obj1=Class1() >>> obj2=Class1() >>> obj1.x1=123 >>> obj2.x2=456 然后我得到了以下错误: >>> obj1.x2 Traceback (most recent call last): File "<pyshell#9>", line

我的代码:

>>> class Class1:
    pass

>>> obj1=Class1()
>>> obj2=Class1()
>>> obj1.x1=123
>>> obj2.x2=456
然后我得到了以下错误:

>>> obj1.x2

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    obj1.x2
AttributeError: Class1 instance has no attribute 'x2'

动态添加字段与类定义中包含的字段之间有什么区别?

如果
obj1
Class1
的实例,则它是在基于实例的级别添加变量

这可以如下所示

class Test(object): pass 
a = Test()
b = Test()
a.a = 4
print a.a
print b.a # Attribute error here.
如果要添加类级别变量,请直接将其应用于
Test

Test.a = 432
print b.a
print a.a

如果
obj1
Class1
的一个实例,则它在基于实例的级别上添加变量

这可以如下所示

class Test(object): pass 
a = Test()
b = Test()
a.a = 4
print a.a
print b.a # Attribute error here.
如果要添加类级别变量,请直接将其应用于
Test

Test.a = 432
print b.a
print a.a
现场即时添加和 包含在类定义中

这是在类定义中:

>>> class Class1:
    x = None
证明:

这在实例级别:

>>> class Class1:
    def __init__(self):
    self.x = None
证明:

您也可以动态地将属性添加到类定义中

证明:

现场即时添加和 包含在类定义中

这是在类定义中:

>>> class Class1:
    x = None
证明:

这在实例级别:

>>> class Class1:
    def __init__(self):
    self.x = None
证明:

您也可以动态地将属性添加到类定义中

证明:


obj1
obj2
到底是什么?在您的示例中缺少一个
obj1=Class1()
?抱歉,它在我的代码中。我刚才的问题没有回答。更新。到底什么是
Class2
obj1.x2
导致错误,因为
obj1
没有
x2
属性--您将该属性添加到
Class1
obj2
实例中,它不会自动将其添加到现有的
obj1
实例中。到底什么是
obj1
obj2
?在您的示例中缺少一个
obj1=Class1()
?抱歉,它在我的代码中。我刚才的问题没有回答。更新。到底什么是
Class2
obj1.x2
导致错误,因为
obj1
没有
x2
属性--您将该属性添加到
Class1
obj2
实例中,它不会自动将其添加到现有的
obj1
实例中。因此类级变量和实例级变量之间存在差异。这与传统的OOP思维有很大的不同。@smwikipedia只是在某种意义上,将变量添加到现有对象是很奇怪的。@smwikipedia:相反实际上没有多大意义,因为所有变量都是类级变量的情况会导致所有实例之间的共享状态。您将有一个对单例类的引用集合,因此类级变量和实例级变量之间存在差异。这与传统的OOP思维有很大的不同。@smwikipedia只是在某种意义上,将变量添加到现有对象是很奇怪的。@smwikipedia:相反实际上没有多大意义,因为所有变量都是类级变量的情况会导致所有实例之间的共享状态。您将有一个对singleton类的引用集合。
>>> class Class1: pass
... 
>>> foo = Class1()
>>> foo.__dict__
{}
>>> foo.x = None
>>> foo.__dict__
{'x': None}
>>> Class1.__dict__
{'__module__': '__main__', '__doc__': None}
>>> class Class1: pass
... 
>>> Class1.__dict__
{'__module__': '__main__', '__doc__': None}
>>> Class1().__dict__
{}
>>> Class1.x = None
>>> Class1.__dict__
{'x': None, '__module__': '__main__', '__doc__': None}
>>> Class1().__dict__
{}
>>> Class1().x
>>> print Class1().x
None