Python包装器获取包装对象

时间:2021-07-16 11:33:16

标签: python wrapper magic-methods

我确实有一个特定对象的包装类,给它一些额外的方法。 然而,这个对象(包装与否)通常作为参数传递。在这种情况下,我想始终通过原始(包装的)对象。

如果我在打印时执行以下操作,是否有办法(我猜是魔术方法)覆盖返回的内容:

class Foo:
    pass

C = Foo()
print(C)

我现在知道这实际上是在调用 __repr__(它必须是一个 str)。如果我对函数调用做同样的事情

def Bar(obj):
    pass

获取 Bar 是一个字符串还是这里的实际类?

我如何包装对象:

class Wrapper:
    def __init__(self, obj):
        self._obj = obj
   
    def __getattr__(self, attr):
        orig_attr = self._obj.__getattribute__(attr)
        if callable(orig_attr):

            def hooked(*args, **kwargs):
                result = orig_attr(*args, **kwargs)
                # prevent wrapped_class from becoming unwrapped
                if result == self._obj:
                    return self
                return result

            return hooked
        else:
            return orig_attr

如果这样做:

C_wrapped = Wrapper(C)

然后

Bar(C_wrapped)

如果真的让它充当

Bar(C)

即使通过C_wrapped

1 个答案:

答案 0 :(得分:0)

我发现的解决方案是函数 Bar(或我的例子中的对象)需要检查它是否获得了包装或未包装的对象。如果已包装,Bar 将打开它。 缺点是这会导致耦合。

相关问题