【问题标题】:Python wrapper get wrapped objectPython包装器获取包装的对象
【发布时间】:2021-07-16 11:33:16
【问题描述】:

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

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

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

【问题讨论】:

  • FWIW,print(...) 触发 __str__,而不是 __repr____repr__ 仅在对象位于打印容器内时触发
  • 当然bar 得到obj,而不是obj 的字符串表示形式(那将毫无用处,不是吗?)
  • 反正这个问题有点不清楚。你问的是decorators吗?
  • 这一点都不清楚。您想包装您的对象,然后让您的代码自动忽略包装器?为什么?
  • 我不确定我在寻找什么。顶级我想要问题最后一部分所述的行为。如果我传递原始对象或包装对象,则始终将包装对象作为参数传递。

标签: python wrapper magic-methods


【解决方案1】:

我找到的解决方案是函数 Bar(或在我的情况下为对象)需要检查它是否获得了已包装或未包装的对象。如果它被包裹,Bar 会解开它。 缺点是这会导致耦合。

【讨论】:

    猜你喜欢
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多