在您的第一个示例中,您正在定义实例属性。第二,类属性。
类属性在该类的所有实例之间共享,其中实例属性由该特定实例“拥有”。
示例差异
为了理解这些差异,让我们举个例子。
我们将定义一个具有实例属性的类:
class MyClassOne:
def __init__(self):
self.country = "Spain"
self.city = "Barcelona"
self.things = []
还有一个具有类属性:
class MyClassTwo:
country = "Spain"
city = "Barcelona"
things = []
还有一个函数可以打印出有关这些对象之一的信息:
def information(obj):
print "I'm from {0}, ({1}). I own: {2}".format(
obj.city, obj.country, ','.join(obj.things))
让我们创建 2 个MyClassOne
对象,将其中一个更改为 Milan,并给 Milan “一些东西”:
foo1 = MyClassOne()
bar1 = MyClassOne()
foo1.city = "Milan"
foo1.country = "Italy"
foo1.things.append("Something")
当我们调用information()
时foo1
,bar1
我们会得到您期望的值:
>>> information(foo1)
I'm from Milan, (Italy). I own: Something
>>> information(bar1)
I'm from Barcelona, (Spain). I own:
但是,如果我们要做完全相同的事情,但使用实例,MyClassTwo
您会发现类属性在实例之间是共享的。
foo2 = MyClassTwo()
bar2 = MyClassTwo()
foo2.city = "Milan"
foo2.country = "Italy"
foo2.things.append("Something")
然后打电话information()
...
>>> information(foo2)
I'm from Milan, (Italy). I own: Something
>>> information(bar2)
I'm from Barcelona, (Spain). I own: Something
如您所见 -things
在实例之间共享。things
是对每个实例都可以访问的列表的引用。因此,如果您从任何实例附加到事物,那么所有其他实例都会看到相同的列表。
您在字符串变量中看不到这种行为的原因是您实际上是在为实例分配一个新变量。在这种情况下,该引用由实例“拥有”,而不是在类级别共享。为了说明,让我们为事物分配一个新列表bar2
:
bar2.things = []
这导致:
>>> information(foo2)
I'm from Milan, (Italy). I own: Something
>>> information(bar2)
I'm from Barcelona, (Spain). I own: