[英]Class variable vs instance variable
通過python文檔學習python時,我遇到了以下內容,其中解釋了類變量是該類共有的,並且任何對象都可以更改它:
示例代碼1:
class Dog:
tricks = [] # mistaken use of a class variable
def __init__(self, name):
self.name = name
def add_trick(self, trick):
self.tricks.append(trick)
輸出:
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.add_trick('roll over')
>>> e.add_trick('play dead')
>>> d.tricks # unexpectedly shared by all dogs
['roll over', 'play dead']
問題=>如果是這樣,那么當x
將其tricks
屬性更改為5時,為什么以下示例中的y
不會受到影響?
示例代碼2:
class Complex:
tricks = 3
def __init__(self,var1):
self.tricks=var1
def add_tricks(self,var1):
self.tricks=var1
x = Complex(11)
y = Complex(12)
print (x.tricks)
print (y.tricks)
x.add_tricks(5)
print (x.tricks)
print (y.tricks) -->Remains unchanged
輸出:
11
12
5
12 -->Remains unchanged
當我在以下程序中刪除self
時,到底有什么區別:
示例代碼3:
class Complex:
tricks = 3
def __init__(self,var1):
self.tricks=var1
def add_tricks(self,var1):
tricks=var1
x = Complex(11)
y = Complex(12)
print (x.tricks)
print (y.tricks)
x.add_tricks(5) -->This change is not reflected anywhere
print (x.tricks)
print (y.tricks)
print(Complex.tricks)
輸出:
11
12
11
12
3
該示例可以是說明性的。 給定下面的類(我從您的示例中刪除了初始化程序,因為它不能讓我們演示行為):
class Complex:
tricks = 3
def add_tricks(self, value):
self.tricks = value
我們可以看到,創建后,它們的tricks
屬性的值均為3
:
>>> a = Complex()
>>> b = Complex()
>>>
>>> a.tricks
3
>>> b.tricks
3
讓我們花點時間看一下在這些對象上定義的名稱:
>>> a.__dict__
{}
>>> b.__dict__
{}
它們本身都是沒有屬性的對象。 讓我們add_tricks
在b
上調用add_tricks
之后會發生什么:
>>> b.add_tricks(5)
>>>
>>> a.tricks
3
>>> b.tricks
5
好的。 因此,看來共享價值並未受到影響。 讓我們再次看看他們的名字:
>>> a.__dict__
{}
>>> b.__dict__
{'tricks': 5}
在那里。 分配給self.tricks
會創建一個該對象局部的屬性,該屬性具有名稱tricks
,當通過對象(或self
)訪問該屬性時,我們便會使用此屬性。
共享的價值仍然存在並且不變:
>>> a.__class__.tricks
3
>>> b.__class__.tricks
3
它只是在類上,而不是在對象上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.