使'isinstance'与装饰器一起工作

Pau*_*nta 2 python decorator isinstance

Python isinstance函数如何在内部工作?我可以做些什么来改变它的结果,比如在类中定义一个特殊的函数还是什么?这是我的用例:

class Decorator:
    def __init__(self, decorated):
        self._decorated = decorated

    def __call__(self):
        return self._decorated()

@Decorator
class Foo:
    pass

f = Foo()

# How can I make this be true?
isinstance(f, Foo)
Run Code Online (Sandbox Code Playgroud)

Decorator除了混合在这里不合适之外,它几乎就像混合物一样.有什么方法可以让上面的代码工作吗?我还应该注意该isinstance行也会出现以下错误:

    isinstance(f,Foo)
TypeError:isinstance()arg 2必须是类型或类型的元组

NPE*_*NPE 5

以下内容如何:

def Decorator(decorated):
    class Dec(decorated):
        def __call__(self):
            print 'in decorated __call__'
            return decorated.__call__(self)
    return Dec

@Decorator
class Foo(object):
    def __call__(self):
        print 'in original __call__'

f = Foo()

# How can I make this be true?
print isinstance(f, Foo)
Run Code Online (Sandbox Code Playgroud)

使用上面的代码:

  • isinstance(f, Foo) 作品;
  • f() 调用deco方法然后转发到原始方法.

基本思想是确保装饰Foo仍然是一个类,并确保装饰Foo是原始的子类Foo.

PS这一切的目的对我来说并不完全清楚; 可能是元类是实现你想要做的事情的更好方法.