1. 程式人生 > >python進階-- 04 如何定制類

python進階-- 04 如何定制類

ots ace 檢驗 exec 關聯 add 有關 del att

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 如何定制類