>>> def set_age(self, age): # 定義乙個函式作為例項方法
... self.age = age
...>>> from types import methodtype
>>> s.set_age = methodtype(set_age, s, student) # 給例項繫結乙個方法
>>> s.set_age(25) # 呼叫例項方法
>>> s.age # 測試結果
25
為了給所有例項都繫結方法,可以給class繫結方法:
>>> def set_score(self, score):
... self.score = score
...>>> student.set_score = methodtype(set_score, none, student)
用來限制class可以新增的屬性
>>> class student(object):
... __slots__ = ('name', 'age') # 用tuple定義允許繫結的屬性名稱
...
使用__slots__要注意,它定義的屬性只對當前類起作用,對繼承的子類是不起作用的。
除非在子類中也定義__slots__,這樣,子類允許定義的屬性就是自身的__slots__加上父類的__slots__。
python內建的@property裝飾器負責把乙個方法變成屬性呼叫。
class student(object):
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if not isinstance(value, int):
raise valueerror('score must be an integer!')
if value < 0 or value > 100:
raise valueerror('score must between 0 ~ 100!')
self._score = value
'''@property
def birth(self):
return self._birth
@birth.setter
def birth(self, value):
self._birth = value
'''
@property
的實現比較複雜,我們先考察如何使用。把乙個getter方法變成屬性,只需要加上@property
就可以了,此時,@property
本身又建立了另乙個裝飾器@score.setter
,負責把乙個setter方法變成屬性賦值,於是,我們就擁有乙個可控的屬性操作:
>>> s = student()
>>> s.score = 60 # ok,實際轉化為s.set_score(60)
>>> s.score # ok,實際轉化為s.get_score()
60>>> s.score = 9999
traceback (most recent call last):
...valueerror: score must between 0 ~ 100!
多重繼承就是繼承多個父類,這樣乙個子類就可以同時獲得多個父類的所有功能。
例如
class dog(mammal, runnable):
pass
目的是給乙個類增加多個功能,在設計類的時候,優先考慮通過多重繼承來組合多個mixin的功能。
__str__()返回乙個好看的字串————改變的是print輸出變數
__repr__()改變的事直接顯示變數呼叫,為除錯服務
__iter__
如果乙個類想被用於for...in迴圈,類似list或者tuple那樣,就必須實現乙個__iter__()
方法,該方法返回乙個迭代物件,然後,python的for迴圈就會不斷呼叫該迭代物件的next()
方法拿到迴圈的下乙個值,直到遇到stopiteration錯誤時退出迴圈。
我們以斐波那契數列為例,寫乙個fib類,可以作用於for迴圈:
class fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化兩個計數器a,b
def __iter__(self):
return self # 例項本身就是迭代物件,故返回自己
def next(self):
self.a, self.b = self.b, self.a + self.b # 計算下乙個值
if self.a > 100000: # 退出迴圈的條件
raise stopiteration();
return self.a # 返回下乙個值
現在,試試把fib例項作用於for迴圈:
>>> for n in fib():
... print n
...112
35...46368
75025
更多定製類翻看部落格
type()和metaclass(元類)
先定義metaclass,就可以建立類,最後建立例項。metaclass允許你建立類或者修改類。換句話說,你可以把類看成是metaclass建立出來的「例項」。
再一次重新學習Python 錯誤 除錯和測試
一種用try.except.finally捕獲錯誤並用raise丟擲 assert 斷言 凡是用print來輔助檢視的地方,都可以用斷言 assert 來替代 err.py def foo s n int s assert n 0,n is zero return 10 n def main foo...
再一次求助
編24點程式時遇到的問題 大佬好呀,python小白又來求助啦!這次的問題是在編24點時遇到的乙個問題 如何將使用者輸入的數字運算出結果?源 import random shuzi str one str random.randint 1,10 shuzi str two str random.ra...
開始再一次學習Git
這是乙個自己的管理自己學習經驗的文件。由於學習總是斷斷續續,所以沒有花時間整個學習git,這次勢必要搞懂git的相關的機制。我看的是廖雪峰的git教程,講的很不錯。接下來,開始做相關的筆記。可能會陸陸續續的進行修改 2017.3.24 今天下午,在上 軟體測試 的時候就在看git,本來是想在idea...