2012-01-11 32 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

相关问题