我试图劫持对我的类的任何调用,并将它们传递给我在类上选择的方法。
到目前为止我的班级:
class Klass(object):
def __getattribute__(self, name):
if name == '_dummy_func':
return object.__getattribute__(self, name)
return object.__getattribute__(self, 'dummy_func')
def _dummy_func(self):
print 'dummy func called!'
当我这样做的时候有效:
cls = Klass()
cls.foo()
但在尝试这样做时摔倒了:
cls = Klass()
cls.foo.bar()
因为CCD_ 1不具有属性CCD_。
我试图通过检查name
是否是这里描述的函数来捕捉__getattribute__()
中的这种嵌套行为,但它是一个字符串,而不是实际的变量。
有没有办法从Klass
内部捕捉到这一点?
不返回伪函数,只返回一个伪object即可通过__call__
方法调用,并定义__getattr__
在请求属性时返回另一个伪对象:
class Dummy(object):
def __init__(self, klass, path):
self.klass = klass
self.path = path
def __getattr__(self, attr):
return Dummy(self.klass, self.path + [attr])
def __call__(self, *args, **kw):
self.klass._dummy_func(self.path, *args, **kw)
class Klass(object):
def __getattr__(self, attr):
return Dummy(self, [attr])
def _dummy_func(self, path, *args, **kw):
print "Dummy function %s called with %d arguments!"
% ('.'.join(path), len(args))
Klass().foo.bar.func(1, 2)
# => "Dummy function foo.bar.func called with 2 arguments!"
现在,您可以根据_dummy_func
的完整路径应用您的逻辑。您甚至可以使用提供的参数和关键字。