您好,登錄后才能下訂單哦!
官網解釋:
object.
__getattr__
(self, name)
Called when an attribute lookup has not found the attribute in the usual places (i.e. it is not an instance attribute nor is it found in the class tree for self
). name
is the attribute name. This method should return the (computed) attribute value or raise an AttributeError
exception.
當我們想調用Class中某些東西,而Class中沒有,解釋器鐵定報錯,停止運行,那有人就想了:真麻煩,每次都要重新執行一遍,如果當我調用錯了內容,程序能把我這個錯誤當默認程序執行,而不停止我程序運行就好了。so,為了解決這類問題,就出來了__getattr__這個函數了。
我猜的,因為解決程序困難也是一種需求。
看沒有__getattr的出錯調用:
#!/usr/bin/python
# -*- coding: utf-8 -*-
class Student(object):
def __init__(self):
self.name = 'Michael'
s = Student()
print s.name
print s.score #Class中沒有這個屬性
look, 第一個print正常執行,第二個由于Class中沒有這個屬性,所以就報錯了。
再看,帶__getattr__的Class:
#!/usr/bin/python
# -*- coding: utf-8 -*-
class Student(object):
def __init__(self):
self.name = 'Michael'
def __getattr__(self, other):
if other=='score':
return 99
s = Student()
print s.name
print s.score #Class中沒有這個屬性
print s.gg #Class中沒有這個屬性
look again, print 的score 和 gg 在Class中都沒有定義,但都有輸出。因為程序往__getattr__中找,剛剛好定義了一個字符判斷 if other=='score':, 所以輸出了99 ,而gg一個字都沒提,就默認輸出None了。是不是感覺以后碼程序的時候再也不用擔心程序停止運行了。
※發現的強大的鏈式調用寫法:
class Chain(object): def __init__(self, path=''): self._path = path def __getattr__(self, path): return Chain('%s/%s' % (self._path, path)) #調用自己 def __str__(self): return self._path __repr__ = __str__ f = Chain() print (f.www.anc.do.glob)
結果:
/www/anc/do/glob
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。