1. 程式人生 > >Python3.X之面向物件高階程式設計筆記

Python3.X之面向物件高階程式設計筆記

1、使用slots
Python允許在定義class的時候,定義一個特殊的slots變數,來限制該class例項能新增的屬性,使用slots要注意,slots定義的屬性僅對當前類例項起作用,對繼承的子類是不起作用的,除非在子類中也定義slots,這樣,子類例項允許定義的屬性就是自身的slots加上父類的slots
class Student(object):
slots = (‘name’, ‘age’) # 用tuple定義允許繫結的屬性名稱
2、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

>>> 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!
3、定製類(建立一個空的類,然後使用dir()函式可以看到這些屬性)
str()
repr()
兩者的區別是str()返回使用者看到的字串,而repr

()返回程式開發者看到的字串,也就是說,repr()是為除錯服務的.類似於Java的toString
iter
getitem
getattr
4、使用列舉類
from enum import Enum
Month = Enum(‘Month’, (‘Jan’, ‘Feb’, ‘Mar’, ‘Apr’, ‘May’, ‘Jun’, ‘Jul’, ‘Aug’, ‘Sep’, ‘Oct’, ‘Nov’, ‘Dec’))
@unique裝飾器可以幫助我們檢查保證沒有重複值。
5、使用元類
要建立一個class物件,type()函式依次傳入3個引數:
   1.class的名稱;
   2.繼承的父類集合,注意Python支援多重繼承,如果只有一個父類,別忘了tuple的單元素寫法;
  3.class的方法名稱與函式繫結,這裡我們把函式fn繫結到方法名hello上。
6、metaclass
除了使用type()動態建立類以外,要控制類的建立行為,還可以使用metaclass。
metaclass,直譯為元類,簡單的解釋就是:
當我們定義了類以後,就可以根據這個類創建出例項,所以:先定義類,然後建立例項。
但是如果我們想創建出類呢?那就必須根據metaclass創建出類,所以:先定義metaclass,然後建立類。
連線起來就是:先定義metaclass,就可以建立類,最後建立例項。
所以,metaclass允許你建立類或者修改類。換句話說,你可以把類看成是metaclass創建出來的“例項”。
metaclass是Python面向物件裡最難理解,也是最難使用的魔術程式碼。正常情況下,你不會碰到需要使用metaclass的情況,所以,暫時看不懂也沒關係。