Python學習筆記(十六):類程式碼編寫細節
阿新 • • 發佈:2019-02-11
以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中帶有連結的字典。