gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:04:15 25 4
gpt4 key购买 nike

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)

Decorator 的行为几乎就像一个 mixin,除了混合在这里不合适。有什么办法可以让上面的代码工作吗?我还应该注意到 isinstance 行也给出了以下错误:

    isinstance(f, Foo)
TypeError: isinstance() arg 2 must be a type or tuple of types

最佳答案

以下情况如何:

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)

使用上面的代码:

  • isinstance(f, Foo) 有效;
  • f() 调用装饰方法,然后转发到原始方法。

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

附言我不完全清楚这一切的目的。元类可能是实现您想要做的事情的更好方法。

关于python - 使 'isinstance' 与装饰器一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7514968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com