1. 程式人生 > >Python學習筆記(十六):類程式碼編寫細節

Python學習筆記(十六):類程式碼編寫細節

以Mark Lutz著的《Python學習手冊》為教程,每天花1個小時左右時間學習,爭取兩週完成。 --- 寫在前面的話

2013-7-25 15:30 學習筆記

1,把簡單的非函式物件賦值給類屬性,就會產生資料屬性,由所有例項共享。但對例項的屬性進行賦值運算只會在該例項內建立或修改變數名。例如:

class FirstClass:
	data = 'mathboy'
	
	def __init__(self, value):
		self.data = value
	
	def display(self):
		print self.data, FirstClass.data
		

x = FirstClass('linlin')
y = FirstClass('mo')
x.display()
y.display()

FirstClass.data = 'mathboylinlin'
x.display()
y.display()

x.data = 'colin'
x.display()
y.display()

輸出結果為:

linlin mathboy
mo mathboy
linlin mathboylinlin
mo mathboylinlin
colin mathboylinlin
mo mathboylinlin

2,類方法中的self引數,用於返回呼叫的主體,即例項物件。方法可以通過類方法或例項方法的形式呼叫。通過類方法呼叫時,需要明確傳遞一個例項給self引數。例如:
class FirstClass:
	def display(self,value):
		print value
		

x = FirstClass()
x.display('linlin')
FirstClass.display(x, 'mathboy')
輸出結果為:
linlin
mathboy

3,要明確呼叫父類的方法時,則必須使用類呼叫的方法。例如(不一定只是構造方法,其它父類方法也可以):
class FirstClass:
	def __init__(self, value):
		print 'FirstClass: %s' %value
		
class SecondClass(FirstClass):
	def __init__(self, value):
		FirstClass.__init__(self, value)
		print 'SecondClass: %s' %value

x = SecondClass('linlin')
輸出結果為:
FirstClass: linlin
SecondClass: linlin

4,抽象類是這樣來實現的:
class Super:
	def method(self):
		self.action()
		
class MyClass(Super):
	def action(self):
		print 'hello world'
		
x = MyClass()
x.method()
輸出結果為:
hello world

5,__getitem__方法實現過載索引運算。例如:
class MyClass:
	def __getitem__(self, index):
		return index ** 2
		
X = MyClass()
for i in range(5):
	print X[i],
輸出結果為:
0 1 4 9 16

6,Python的所有迭代環境都會先嚐試__iter__方法,再嘗試__getitem__方法。__iter__應返回一個迭代器物件,如果已經提供,Python就會反覆呼叫這個迭代器的next()方法,直到發生StopIteration異常。如果沒有找到類的__iter__方法,則會改用__getitem__機制。例如:
class MyClass:
	def __init__(self, start, stop):
		self.value = start - 1
		self.stop = stop
	
	def __iter__(self):
		return self
	
	def next(self):
		if self.value == self.stop:
			raise StopIteration
		self.value += 1
		return self.value ** 2
		
for x in MyClass(1,2):
    for y in MyClass(3,4):
        print x,y
輸出結果為:
1 9
1 16
4 9
4 16

7,__getattr__和__setattr__用來過載對屬性的引用。例如:
class MyClass1:
	def __getattr__(self, attrname):
		if attrname == 'boy':
			return 'linlin'
		elif attrname == 'girl':
			return 'mo'
		else:
			return ''
	
class MyClass2:
	def __setattr__(self, attr, value):
		if attr == 'boy':
			self.__dict__[attr] = value + 'linlin'
		elif attr == 'girl':
			self.__dict__[attr] = value + 'love'
		else:
			self.__dict__[attr] = value

x = MyClass1()
print x.boy, x.girl

y = MyClass2()
y.boy = 'mathboy'
y.girl = 'mo'
print y.boy, y.girl
輸出結果為:
linlin mo
mathboylinlin molove

8,__del__用於過載析構方法。__repr__和__str__用於過載在對類呼叫repr和str函式時過載返回的字串。__call__用於過載例項呼叫。

9,例項和類物件就是Python中帶有連結的字典。