python定製 python中定製類

2021-10-13 08:51:50 字數 3432 閱讀 3969

1、python中__str__和repr

如果要把乙個類的例項變成 str,就需要實現特殊方法__str__():

classperson(object):def __init__(self, name, gender):

self.name=name

self.gender=genderdef __str__(self):return '(person: %s, %s)' % (self.name, self.gender)

現在,在互動式命令列下用 print 試試:

>>> p = person('bob', 'male')>>> printp

(person: bob, male)

但是,如果直接敲變數 p:

>>>p

似乎__str__() 不會被呼叫。

因為 python 定義了__str__()和__repr__()兩種方法,__str__()用於顯示給使用者,而__repr__()用於顯示給開發人員,__repr__()是為除錯服務的。

有乙個偷懶的定義__repr__的方法:

classperson(object):def __init__(self, name, gender):

self.name=name

self.gender=genderdef __str__(self):return '(person: %s, %s)' %(self.name, self.gender)__repr__ = __str__

例項:classperson(object):def __init__(self, name, gender):

self.name=name

self.gender=genderclassstudent(person):def __init__(self, name, gender, score):

super(student, self).__init__(name, gender)

self.score=scoredef __str__(self):return '(student:%s,%s,%d)'%(self.name,self.gender,self.score)

s= student('bob', 'male', 88)print (s)

2、python中的__cmp__

對 int、str 等內建資料型別排序時,python的 sorted() 按照預設的比較函式 cmp 排序,但是,如果對一組 student 類的例項排序時,就必須提供我們自己的特殊方法 __cmp__():

classstudent(object):def __init__(self, name, score):

self.name=name

self.score=scoredef __str__(self):return '(%s: %s)' %(self.name, self.score)__repr__ = __str__

def __cmp__(self, s):if self.name

elif self.name >s.name:return 1

else:return 0

上述 student 類實現了__cmp__()方法,__cmp__用例項自身self和傳入的例項 s 進行比較,如果 self 應該排在前面,就返回 -1,如果 s 應該排在前面,就返回1,如果兩者相當,返回 0。

student類實現了按name進行排序:

>>> l = [student('tim', 99), student('bob', 88), student('alice', 77)]>>> printsorted(l)

[(alice:77), (bob: 88), (tim: 99)]

注意: 如果list不僅僅包含 student 類,則 __cmp__ 可能會報錯:

3、python中的__len__

如果乙個類表現得像乙個list,要獲取有多少個元素,就得用 len() 函式。

要讓 len() 函式工作正常,類必須提供乙個特殊方法__len__(),它返回元素的個數。

例如,我們寫乙個 students 類,把名字傳進去:

classstudents(object):def __init__(self, *args):

self.names=argsdef __len__(self):return len(self.names)

只要正確實現了__len__()方法,就可以用len()函式返回students例項的「長度」:

>>> ss = students('bob', 'alice', 'tim')>>> printlen(ss)3

4、python中數**算

python 提供的基本資料型別 int、float 可以做整數和浮點的四則運算以及乘方等運算。

但是,四則運算不侷限於int和float,還可以是有理數、矩陣等。

要表示有理數,可以用乙個rational類來表示:

classrational(object):def __init__(self, p, q):

self.p=p

self.q= q

p、q 都是整數,表示有理數 p/q。

如果要讓rational進行+運算,需要正確實現__add__:

classrational(object):def __init__(self, p, q):

self.p=p

self.q=qdef __add__(self, r):return rational(self.p * r.q + self.q * r.p, self.q *r.q)def __str__(self):return '%s/%s' %(self.p, self.q)__repr__ = __str__

現在可以試試有理數加法:

>>> r1 = rational(1, 3)>>> r2 = rational(1, 2)>>> print r1 +r25/6

5、python中型別轉換

rational類實現了有理數運算,但是,如果要把結果轉為 int 或 float 怎麼辦?

考察整數和浮點數的轉換:

>>> int(12.34)12

>>> float(12)12.0

如果要把 rational 轉為 int,應該使用:

r = rational(12, 5)

n= int(r)

要讓int()函式正常工作,只需要實現特殊方法__int__():

classrational(object):def __init__(self, p, q):

self.p=p

self.q=qdef __int__(self):return self.p // self.q

結果如下:

>>> print int(rational(7, 2))3

>>> print int(rational(1, 3))

同理,要讓float()函式正常工作,只需要實現特殊方法__float__()。

python中的定製類

str 在python中方法名如果是 x 的,那麼就有特殊的功能,因此叫做 魔法 方法 當使用print輸出物件的時候,只要自己定義了 str self 方法,那麼就會列印從在這個方法中return的資料 class student object def init self,name self.na...

Python 定製序列

1 python中的三大容器 列表list,元組tuple,字串string 2 python允許我們定製乙個不可變的容器,如string,中就不能有修改容器的資料方法,如 setitem delitem 3 如果希望定製的容器支援reversed 內建函式,則容器中需定義 reversed 方法,...

python 簡單定製

基本要求 定製乙個計時器的類 start和stop方法代表啟動計時和停止計時 假設計時器物件t1,print t1 和直接呼叫t1均顯示結果 當計時器未啟動或已經停止計時,呼叫stop方法會給予溫馨的提示 兩個計時器物件可以進行相加 t1 t2 只能使用提供的有限資源完成 你需要使用這些資源 str...