Python類的一些有趣的函式

2021-07-03 22:03:08 字數 2524 閱讀 6326

我們在使用python時,常會用到一些方法,如print,len,物件比較等,舉乙個例子:

>>> l = range(10)

>>> print l

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> l

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> len(l)

10>>> l1 = range(1)

>>> l > l1

true

>>>

如果自己實現乙個類,是否可以使用這些方法呢,我們來簡單試一下:

>>> t = test(10)

>>> t2 = test(1)

>>> print t

<__main__.test instance at 0x01c884b8>

>>> t

<__main__.test instance at 0x01c884b8>

>>> len(t)

traceback (most recent call last):

file "", line 1, in len(t)

attributeerror: test instance has no attribute '__len__'

>>> t > t2

true

>>>

從上面的例子可以看到,print列印出來的內容與list列印是有區別的,另外len呼叫報錯,說test中沒有__len__,並且對於t>t2的比較,也不是按照value的值來比較的,當然前面的list比較也存在這個問題,那對於構造類,我們就無能為力了嗎。其實不是這樣的,在python裡我們是可以對這些行為進行定義的

當我們在python裡呼叫print t時,實際上是呼叫了print str(t),而str(t)內部,則呼叫了t的__str__(self)方法,我們只要對這個方法進行重定義即可控制print t的輸出:

>>> class test:

def __init__(self, v):

self.value = v

def __str__(self):

return "this is a test class"

>>> t = test(100)

>>> print t

this is a test class

>>> t

<__main__.test instance at 0x01d14c88>

>>>

上面,我們重定義了test的__str__方法,可以看到print t變為了:

this is a test class

但是我們直接輸出t,其結果仍然為:

<__main__.test instance at 0x01d14c88>
那是因為這個輸出呼叫的是__repr__,而類似的,len呼叫的是__len__,物件比較呼叫了__cmp__,我們可以按照這個思路對test進行補充:

>>> class test:

def __init__(self, v):

self.value = v

def __str__(self):

return "__str__: test class"

def __repr__(self):

return "__repr__: test class"

def __len__(self):

return 8

def __cmp__(self, t):

if self.value < t.value:

return -1

elif self.value > t.value:

return 1

else:

return 0

>>> t = test(10)

>>> t2 = test(1)

>>> print t

__str__: test class

>>> t

__repr__: test class

>>> len(t)

8>>> t > t2

true

>>> t3 = test(88)

>>> t > t3

false

python裡還有許多類似的方法,如:

__getitem__(self, key)

__setitem__(self, key, value)

__delitem__(slef, key)

__getattribute__(self, name)

__getattr__(self, name)

__setattr__(self, name)

__iter__(self)

這些函式主要和列表,字典等型別相關,使用dir(list)或dir(dict)都可以看到

一些有趣的函式

split 函式是用來處理字串的,遍歷字串,當遇到某一標誌時則將字串分割成列表。例如 s jhdj dkdskd s dskdh sdsdk sdksd skd sds kd sd s1 s.split 標誌設定為空格執行結果 jhdj dkdskd s dskdh sdsdk sdksd skd ...

php 一些神奇加有趣的函式

返回陣列維數 層級 author echo param array arr return int function getarrlv arr ma array 從行首匹配 空白 至第乙個左括號,要使用多行開關 m preg match all s m print r arr,true ma 轉字串長...

一些有趣的演算法題

老崔去某廠筆試時,遇到了經典的 狼 羊 白菜 過河問題 由於經常看演算法方面的內容,這道對於他來說,so easy。題目大概是這樣 題號1 農夫需要把狼 羊 菜和自己運到河對岸去,只有農夫能夠划船,而且船比較小,除農夫之外每次只能運一種東西,還有乙個棘手問題,就是如果沒有農夫看著,羊會偷吃菜,狼會吃...