再一次重新學習Python 物件導向高階程式設計

2021-08-21 16:30:12 字數 2860 閱讀 3829

>>> 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...