簡體   English   中英

如何捕獲Python類中不存在的嵌套變量的查找?

[英]How to catch the lookup of non-existent nested variables on a Python class?

我試圖劫持對我的班級的任何調用,並將它們傳遞給我在課堂上選擇的方法。

我的班級到目前為止:

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是否是這里描述的函數來嘗試捕獲__getattribute__()中的這種嵌套行為,但它是一個字符串而不是實際的變量。

有辦法從Klass里面抓住這個嗎?

只返回一個可通過__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的完整路徑應用邏輯。 您甚至可以獲得提供的參數和關鍵字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM