__call__ 類(例項)呼叫時(加括號)執行
__str__列印物件時執行
今天get到的新技能:
我們把 person 類變成乙個可呼叫物件:我們再看乙個例子:class person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
def __call__(self, friend):
print 'my name is %s...' % self.name
print 'my friend is %s...' % friend
p = person('bob', 'male')
p('tim')
輸出的結果為:
my name is bob...
my friend is tim...
class fib(object):輸出結果為:def __init__(self):
pass
def __call__(self,num):
a,b = 0,1;
self.l=
for i in range (num):
a,b= b,a+b
return self.l
def __str__(self):
return str(self.l)
__rept__=__str__
f = fib()
print f(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
我們可以看出__call__函式呼叫時直接 類名+()就可以呼叫
class person(object):def __init__(self, name, gender):
self.name = name
self.gender = gender
def __str__(self):
return '(person: %s, %s)' % (self.name, self.gender)
p = person('bob', 'male')
print p #列印物件時執行特殊函式__str__()
(person: bob, male)
但是,如果直接敲變數 p 結果是:看了下邊的例子就明白了#類person的物件p的記憶體位址(0x表示十六進製制)。
似乎__str__() 不會被呼叫。
class test(object):
def __init__(self, value='hello, world!'):
self.data = value
>>> t = test()
>>> t
<__main__.test at 0x7fa91c307190>
>>> print t
<__main__.test object at 0x7fa91c307190>
# 看到了麼?上面列印類物件並不是很友好,顯示的是物件的記憶體位址
# 下面我們重構下該類的__repr__以及__str__,看看它們倆有啥區別
# 重構__repr__
class testrepr(test):
def __repr__(self):
return 'testrepr(%s)' % self.data
>>> tr = testrepr()
>>> tr
testrepr(hello, world!)
>>> print tr
testrepr(hello, world!)
# 重構__repr__方法後,不管直接輸出物件還是通過print列印的資訊都按我們__repr__方法中定義的格式進行顯示了
# 重構__str__
calss teststr(test):
def __str__(self):
return '[value: %s]' % self.data
>>> ts = teststr()
>>> ts
<__main__.teststr at 0x7fa91c314e50>
>>> print ts
[value: hello, world!]
# 你會發現,直接輸出物件ts時並沒有按我們__str__方法中定義的格式進行輸出,而用print輸出的資訊卻改變了
__repr__和__str__這兩個方法都是用於顯示的,__str__是面向使用者的,而__repr__面向程式設計師。
當我們想所有環境下都統一顯示的話,可以重構__repr__方法;當我們想在不同環境下支援不同的顯示,例如終端使用者顯示使用__str__,而程式設計師在開發期間則使用底層的__repr__來顯示,實際上__str__只是覆蓋了__repr__以得到更友好的使用者顯示。
總結 日常總結
最近變得浮躁了,學不進了,那就寫總結吧。關於刷題 從去年十一月份到現在,感覺唯一堅持的意見事情就是刷力扣了。四個多月,寫了六百多道題,大概有四五題一天,然後也在堅持參加周賽。很多時候,有些事情成了習慣,那麼也就不需要去堅持了。比如說現在,每天都是先把每日一題和劍指 offer 的任務完成了再開始做其...
日常學習總結
關於vb中的把字串 日期型 數值型 賦值給某個變數的寫法 eg dim m1,r 此處我並不清楚 m1 到底是什麼型別 所以vb會自動匹配其應該所屬的型別,這是vb的一點強大之處 m select fitemid from t item where fitemclassid 3 and fnumbe...
Android日常總結
個人在此記錄一下.2,有時候 出現了異常,但是androidstudio並不列印錯誤資訊.這時候,我們可以通過斷點來除錯,如果斷點走到某一步了,不繼續往下面走,說名剛剛的那行 有問題,比如說textview.settext 1 textview設定乙個int值,這時系統可能沒有列印錯誤日誌.3,在l...