以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中帶有鏈接的字典。