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