2016-12-28 40 views
-2

我正在嘗試學習oop概念,並且選擇了python。據我所知,self.count和employee.count都調用類變量計數,它們都應該具有相同的值。但是,下面的代碼,我看到self.count是1和employee.count爲0python中的self.variable name和classname.variable之間的區別

class employee: 
    count=0 
    def __init__(self,x): 
     self.x=x 
     self.count=self.count+1 
     print ("this method is executed") 
     print (self.count) 
     print (employee.count) 
emp1=employee("John")  
+0

所以他們顯然是*不是*相同的變量;那麼,你的問題是什麼?你有沒有嘗試製造其他的「僱員」對象? –

+0

No ... self.count和employee.count都指的是前面聲明的同一個類變量count – vijay

+0

@vijay但是直到你聲明實例變量'self.count' ... – Keiwan

回答

-2

如果你想統計創建的Employee的數量,你必須創建一個方法,它將調用所有的對象(不是單獨的)。

爲此,請創建方法並使用@staticmethod裝飾她。請注意,此方法在圓括號中沒有self。此外創建變量(這裏:count),它也調用到每個類對象(之前沒有self.)。

最後把我們count變量中__init__+= 1方程(比當新Employee將創建__init__將+1按鈕添加到我們的變量每次)。但請記得在此處添加Employee.之前的count,以統計每個創建Employee作爲班級人口。

class Employee(object): 
    count = 0 

    @staticmethod 
    def status(): 
     print(Employee.count) 

    def __init__(self, x): 
     self.x = x 
     Employee.count += 1 
     print("this method is executed") 
     print("Now, we have got", Employee.count, "Employees") 


emp1 = Employee("John") 

我們可以證明了人口數量:

print(emp1.count) 
emp1.status() 
print(Employee.count) 
+2

請在您的答案中添加一些文字,解釋此代碼片段如何回答OP的問題 –

+0

Here You go!希望我幫助你們 –

1

這是因爲線下的有些微妙:

self.count = self.count + 1 

這裏,self.count在左邊和self.count在右邊是不一樣的東西

這行代碼創建的名稱(即count),其陰影已存在的類的對象(即,employee類)上的相同名稱的變量self對象上的一個實例變量(一個employee實例)。

首先評估右側,並且實際解析類對象上的名稱self.count。預先檢查實例屬性的存在,但由於實例屬性未被綁定,因此它不存在。然後,在評估了右側之後(即,名稱self.count得到解決,並且1被添加到它),評估的結果被綁定到實例屬性。

兩個變量並存:

>>> emp1.count 
1 
>>> emp1.__class__.count 
0 

在這裏學習的關鍵是Python的屬性查找過程:實例命名空間被選中,那麼類的命名空間被選中

+0

因此,在右手side(self.count + 1),最初查找self.count並且沒有找到實例變量。所以,它採用了類變量計數的值(之前已初始化)。找到值(0)後,它將該值遞增並將其分配給實例變量。請糾正我,如果我錯了 – vijay

+0

這是正確的。 – wim

0

emp1實例的類employee。每個實例都有自己的一組變量,稱爲實例變量。這些是在班級內部分配的self.var = ...

如果您嘗試訪問emp1.var和這個實例變量沒有分配,Python將附着在類的emp1一個var變量,這意味着它查找employee.var。這些類型的變量稱爲類變量,它們按照您在課程頂部定義的count=0的方式進行定義。

現在,在您的示例self.count=self.count+1中,左側分配給實例,因此您要創建一個名爲count的實例變量。然而,右側查找self.count,它尚不存在作爲實例變量,因此employee.count實際上被用來代替。如果對實例變量和類變量都不使用相同的變量名稱,則可避免這種混淆行爲。

相關問題