如何捕捉Python类上不存在的嵌套变量的查找?

2024-04-25 13:43:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图劫持对我的类的所有调用,并将它们传递给我在类中选择的方法。你知道吗

我的班级到目前为止:

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()

因为dummy_func没有属性bar。你知道吗

我试图通过检查name是否是here所描述的函数来捕获__getattribute__()中的嵌套行为,但是它是一个字符串而不是实际的变量。你知道吗

有没有办法从内部抓住这个问题?你知道吗


Tags: 方法nameselfreturnobjectfoodefbar
1条回答
网友
1楼 · 发布于 2024-04-25 13:43:36

不要返回一个伪函数,只需返回一个伪对象,该对象可通过__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的完整路径应用逻辑。您甚至可以使用提供的参数和关键字。你知道吗

相关问题 更多 >