python使用類與物件的變數
阿新 • • 發佈:2019-01-24
類的變數 由一個類的所有物件(例項)共享使用。只有一個類變數的拷貝,所以當某個物件對類的變數做了改動的時候,這個改動會反映到所有其他的例項上。
物件的變數 由類的每個物件/例項擁有。因此每個物件有自己對這個域的一份拷貝,即它們不是共享的,在同一個類的不同例項中,雖然物件的變數有相同的名稱,但是是互不相關的。通過一個例子會使這個易於理解。
#!/usr/bin/env python # Filename: objvar.py class Person: '''Represents a person.''' population=0 def __init__(self,name): '''Initializes the person's data.''' self.name=name print '(Initializing %s)' %self.name #When this person is created, he/she adds to the population Person.population+=1 def __del__(self): '''I am dying.''' print '%s says bye.' %self.name self.population-=1 if self.population==0: print 'I am the last one.' else: print 'There are still %d people left.' %self.population def sayHi(self): '''Greeting by the person. Really, that's all it does.''' print 'Hi, my name is %s.' %self.name def howMany(self): '''Prints the current population.''' if Person.population==1: print 'I am the only person here.' else: print 'We have %d persons here.' %self.population swaroop=Person('Swaroop') swaroop.sayHi() swaroop.howMany() kalam=Person('Abdul Kalam') kalam.sayHi() kalam.howMany() swaroop.sayHi() swaroop.howMany() swaroop.__del__ ()
它如何工作
這是一個很長的例子,但是它有助於說明類與物件的變數的本質。這裡,population
屬於Person
類,因此是一個類的變數。name
變數屬於物件(它使用self
賦值)因此是物件的變數。
觀察可以發現__init__
方法用一個名字來初始化Person
例項。在這個方法中,我們讓population
增加1
,這是因為我們增加了一個人。同樣可以發現,self.name
的值根據每個物件指定,這表明了它作為物件的變數的本質。
記住,你只能使用self
變數來參考同一個物件的變數和方法。這被稱為 屬性參考 。
在這個程式中,我們還看到docstring對於類和方法同樣有用。我們可以在執行時使用Person.__doc__
Person.sayHi.__doc__
來分別訪問類與方法的文件字串。
就如同__init__
方法一樣,還有一個特殊的方法__del__
,它在物件消逝的時候被呼叫。物件消逝即物件不再被使用,它所佔用的記憶體將返回給系統作它用。在這個方法裡面,我們只是簡單地把Person.population
減1
。
當物件不再被使用時,__del__
方法執行,但是很難保證這個方法究竟在 什麼時候 執行。如果你想要指明它的執行,你就得使用del
語句,就如同我們在以前的例子中使用的那樣。