我确实有一个特定对象的包装类,给它一些额外的方法。 然而,这个对象(包装与否)通常作为参数传递。在这种情况下,我想始终通过原始(包装的)对象。
如果我在打印时执行以下操作,是否有办法(我猜是魔术方法)覆盖返回的内容:
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
答案 0 :(得分:0)
我发现的解决方案是函数 Bar(或我的例子中的对象)需要检查它是否获得了包装或未包装的对象。如果已包装,Bar 将打开它。 缺点是这会导致耦合。