簡體   English   中英

類變量與實例變量

[英]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_tricksb上調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM