1. 程式人生 > >python使用類與物件的變數

python使用類與物件的變數


類的變數
由一個類的所有物件(例項)共享使用。只有一個類變數的拷貝,所以當某個物件對類的變數做了改動的時候,這個改動會反映到所有其他的例項上。

物件的變數 由類的每個物件/例項擁有。因此每個物件有自己對這個域的一份拷貝,即它們不是共享的,在同一個類的不同例項中,雖然物件的變數有相同的名稱,但是是互不相關的。通過一個例子會使這個易於理解。

#!/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.population1

當物件不再被使用時,__del__方法執行,但是很難保證這個方法究竟在 什麼時候 執行。如果你想要指明它的執行,你就得使用del語句,就如同我們在以前的例子中使用的那樣。