【发布时间】: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