python進階-- 04 如何定制類
1.魔術方法--定義
定義在某一類中(如object中的__str__,list中的__len__等),不需要直接調用該方法,Python中的某些函數或操作符會調用對應的特殊方法(如print調用__str__,len()調用__len__等),任何該類的派生類可以通過重寫這些特殊方法,來自定義這些方法的功能。
2.魔術方法--重寫原則
只編寫用到的特殊方法
有關聯性的特殊方法都必須實現(如__getattr__、__setattr__、__delattr__)
3.魔術方法--屬性相關
構造屬性的get、set、del方法
方法一:
自己編寫他的get、set、del方法,並提供給外部使用,通過指定的set、get方法來進行賦值、取值
class Student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
def get_score(self):
return self.__score
def set_score(self, score):
if score < 0 or score > 100:
raise ValueError(‘invalid score‘)
self.__score = score
方法二:
使用property、setter、getter方法或者裝飾器,外部可直接使用屬性名來賦值、取值,不必通過指定的set、get方法
4.特殊方法--舉例
4.1類方法
__new__(cls, *args,**kw)
通常用於控制生成一個新實例的過程,它是類級別的方法。
4.2實例方法
__init__(self,*args,**kw)
控制初始化一個新實例的過程。自定義“實例=類名(*args,**kw)”
__del__(self)
自定義“del 對象”方法
4.3打印相關
__str__(self)
自定義“print 實例” 或“str(實例)”方法
__repr__(s)
直接在交互行輸入對象時使用
4.4s.attr方式訪問
__getattr__(s, name)
自定義“實例.name”方法
__setattr__(s, name, val)
自定義“實例.name=val”方法
__delattr__(s, name)
自定義“del 實例.name”方法
4.5構造序列
__len__ (self)
自定義“len(實例)”方法
__getitem__ (self,key)
自定義“實例[key]”方法
__setitem__ (self,key,value)
自定義“實例[key]=value”方法
__delitem__(self,key)
自定義“del 實例[key]”方法
4.6構造叠代器
__iter__(self)
__next__(self)
自定義“for tmp in 實例”方法
http://www.maiziedu.com/wiki/python/special/
4.7構造可比較類
_lt_()
自定義“實例 < 實例”方法
_le_()
自定義“實例 <= 實例”方法
_gt_()
自定義“實例 > 實例”方法
_ge_()
自定義“實例 >= 實例”方法
_eq_()
自定義“實例 == 實例”方法
_ne_()
自定義“實例 != 實例”方法
__cmp__(self, other)
自定義“sorted([實例1,實例2,...])” 方法
4.8構造可運算類
_add_()
自定義“實例 + 實例”方法
_sub_()
自定義“實例 - 實例”方法
_mul_()
自定義“實例 * 實例”方法
_div_()
自定義“實例 / 實例”方法
http://www.maiziedu.com/wiki/python/special/
4.9轉換類型
__int__
自定義“int(實例)”方法
__float__
自定義“float(實例)”方法
4.10其他
__slots__
目的是限制當前類所能擁有的屬性(元組形式),如果不需要添加任意動態的屬性,使用__slots__也能節省內存。
class Student(object):
__slots__ = (‘name‘, ‘gender‘, ‘score‘)
def __init__(self, name, gender, score):
self.name = name
self.gender = gender
self.score = score
# 現在,對實例進行操作:
>>> s = Student(‘Bob‘, ‘male‘, 59)
>>> s.name = ‘Tim‘ # OK
>>> s.score = 99 # OK
>>> s.grade = ‘A‘
Traceback (most recent call last):
...
AttributeError: ‘Student‘ object has no attribute ‘grade‘
__call__
自定義“實例(xx)”方法,類似於函數調用。
class Fib(object):
def __init__(self):
pass
def __call__(self,num):
if num<0:
raise ValueError(‘invalid score‘)
L=[]
L.append(0)
if num==1:
return L
L.append(1)
if num ==2:
return L
for i in range(3,num+1):
L.append(L[-1]+L[-2])
return L
f = Fib()
print f(10)
__hash__(s)
自定義“實例1 is 實例2”、“實例1 == 實例2”等方法
http://www.cnblogs.com/pengsixiong/p/5381850.html
__nonzero__(s)
將對象轉為布爾值,自定義“if 實例:”方法
5.特殊語句
5.1exec語句
用來執行儲存在字符串或文件中的Python語句。例如,我們可以在運行時生成一個包含Python代碼的字符串,然後使用exec語句執行這些語句。
下面是一個簡單的例子。
>>> exec ‘print "Hello World"‘
Hello World
5.2eval語句
用來計算存儲在字符串中的有效Python表達式。下面是一個簡單的例子。
>>> eval(‘2*3‘)
6
5.3assert語句
assert 語句用來聲明某個條件是真的。例如,如果你非常確信某個你使用的列表中至少有一個元素,而你想要檢驗這一點,並且在它非真的時候引發一個錯誤,那麽 assert語句是應用在這種情形下的理想語句。當assert語句失敗的時候,會引發一個AssertionError。
>>> mylist = [‘item‘]
>>> assert len(mylist) >= 1
>>> mylist.pop()
‘item‘
>>> assert len(mylist) >= 1
Traceback (most recent call last):
File "", line 1, in ?
AssertionError
5.4raise語句
手動拋出異常
raise ValueError(‘invalid score‘)
6.附錄
6.1python中屬性詳解
可以實現設置只讀屬性(不設置set方法);在set、get、del屬性同時進行自定義動作。
http://python.jobbole.com/80955/
6.2__new__(cls,*args,**kw)與__init__(self,*args,**kw)的區別
http://www.cnblogs.com/ifantastic/p/3175735.html
python進階-- 04 如何定制類