Python:如何拦截不存在的方法调用?

Python:如何拦截不存在的方法调用?,python,Python,我想创建一个类,该类在调用任何可能存在或不存在的方法时都不会给出属性错误: 我的班级: class magic_class: ... # How to over-ride method calls ... ob = magic_class() ob.unknown_method() # Prints 'unknown_method' was called ob.unknown_method2() # Prints 'unknown_method2' was calle

我想创建一个类,该类在调用任何可能存在或不存在的方法时都不会给出
属性错误

我的班级:

class magic_class:
    ...
    # How to over-ride method calls
    ...
ob = magic_class()
ob.unknown_method()
# Prints 'unknown_method' was called

ob.unknown_method2()
# Prints 'unknown_method2' was called
预期输出:

class magic_class:
    ...
    # How to over-ride method calls
    ...
ob = magic_class()
ob.unknown_method()
# Prints 'unknown_method' was called

ob.unknown_method2()
# Prints 'unknown_method2' was called

现在,
unknown_method
unknown_method2
在类中实际上并不存在,但是我们如何在python中拦截方法调用呢?

覆盖
\uuuuuuuuGetAttr\uuuuuu
;请参见

覆盖
\uuuu getattr\uuuuu()
魔术方法:

class MagicClass(object):
    def __getattr__(self, name):
        def wrapper(*args, **kwargs):
            print "'%s' was called" % name
        return wrapper

ob = MagicClass()
ob.unknown_method()
ob.unknown_method2()
印刷品

'unknown_method' was called
'unknown_method2' was called

为了防止有人试图将未知方法委托给对象,下面是代码:

class MagicClass():
定义初始(自我,对象):
self.an_obj=obj
def uu getattr u(self,method_name):
def方法(*args,**kwargs):
打印(“处理未知方法:'{}'.format(方法\名称))
如果是kwargs:
print(“它有以下关键字参数:“+str(kwargs))
如果参数为:
print(“它有以下位置参数:“+str(args))
返回getattr(self.an_obj,方法名称)(*args,**kwargs)
返回方法
当您需要应用时,这非常有用


此外,考虑到args和kwargs,允许您生成完全用户友好的界面,使用MagicClass的人将其视为真实对象。

旁注的可能副本供参考:PEP8说它应该命名为像
类MagicClass:
,新样式至少应该继承对象:
类MagicClass(对象):
这将如何处理像:
ob.calc(10002000)
这样的方法调用。表示如何保留调用的参数?@YugalJindle:Added
*args,**kwargs
以接受包装器中的任意参数。这里的
self.optimizer
是什么?对不起,这是一个输入错误。应该是
self.an_obj
-“optimizer”是我在自己的程序中包装的对象的名称。我编辑了代码:)