使用__getattr__防止方法被调用

时间:2012-01-11 01:31:29

标签: python

我试图阻止实例在调用实例不存在的方法时抛出异常。我尝试过以下方法:

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. 执行功能(打印警告信息)
  4. 最干净的方法是什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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肯定有其余的答案,即返回一个可调用的函数。但是,您可能会考虑其他结构问题,如果拥有一个捕获函数生成器真的是个好主意。