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