2012-01-11 68 views
3

我試圖防止一個實例從拋出異常,如果不爲實例中存在一個方法被調用的方法。我曾嘗試以下:防止被稱爲如果不正確使用__getattr__

class myClass(object): 
    def __init__(self): 
     pass 
    def __getattr__(self,name): 
     print "Warning - method {0} does not exist for this instance".format(name) 

o = myClass() 
var = o.someNonExistantFunction() 

的問題是,我得到以下錯誤:

TypeError: 'NoneType' object is not callable 

的兩件事情我想要做的肯定是:

  1. 返回None因爲我的代碼可以處理的變量被設置爲None
  2. 執行功能(打印一條警告消息)

什麼是做到這一點的乾淨的方式?

回答

3

返回一個什麼也不做的函數?

幾件事情:第一,你可能想使用__getattr__而非__getattribute__
__getattr__當運行時在層次結構中找不到該名稱的任何內容時被調用,每次調用__getattribute__

class Test(object): 
    def __getattr__(self,key): 
     def placeholder(*args, **kwargs): 
      print "Warning - method '%s' does not exist for this instance"%key 
     return placeholder 
+0

非常感謝!剛剛爲placeholder()添加了'* args,** kwargs'參數,以確保它可以使用參數處理不存在的方法(直到它被同行評審纔會出現) – chuckus 2012-01-11 02:04:36

3

__getattr__是一樣的:

def __getattr__(self, name): 
    print "Warning ..." 
    return None 

所以,當你做var = o.someNonExistantFunction(),這在邏輯上是一樣的:

var = o.someNonExistantFunction # == o.__getattr__('someNonExistantFunction') == None 
var() # same as (None)() 

這就是爲什麼你得到的NoneType不可調用錯誤。 Obtuse肯定有答案的其餘部分,即返回可調用函數。但是,您可能會考慮其他結構問題,並且如果擁有一個catchall函數生成器是一個好主意。

+0

我猜Ruby背景whe​​re method_missing? kludges是相當普遍的。 – richo 2012-01-11 02:18:43

+0

因此,警告消息讓我知道修復它在未來的某個時間=) – chuckus 2012-01-11 02:25:11

+1

每當我開始像這樣的python管道工程(我做了很多)我總是試圖記住這句話:調試是兩倍首先編寫代碼。因此,如果你儘可能聰明地編寫代碼,你的定義就不夠聰明,無法進行調試。「--Brian Kernighan – Cyclone 2012-01-11 06:28:03

相關問題