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”是我在自己的程序中包装的对象的名称。我编辑了代码:)