我們在使用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 農夫需要把狼 羊 菜和自己運到河對岸去,只有農夫能夠划船,而且船比較小,除農夫之外每次只能運一種東西,還有乙個棘手問題,就是如果沒有農夫看著,羊會偷吃菜,狼會吃...