日常總結 (四)

2021-08-21 12:44:32 字數 2500 閱讀 8556

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