将内置函数重定向到包装类

2024-04-20 14:15:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个包装类,它的行为方式与被包装的对象完全相同(除了一些特定的例外)。我现在遇到的问题是内置函数。如何将内置函数重定向到包装对象?在

class Wrapper:
    def __init__(self, wrapped):
        object.__setattr__(self, '_wrapped', wrapped)
    def __getattr__(self, name):
        return getattr(object.__getattribute__(self, '_wrapped'), name)

class Foo:
    def __init__(self, val):
        self.val = val
    def __abs__(self):
        return abs(self.val)

foo = Wrapper(Foo(-1))
print(foo.val) # Okay
print(abs(foo)) # TypeError: bad operand type for abs(): 'Wrapper'

Tags: 对象函数nameselfobjectfooinitdef
1条回答
网友
1楼 · 发布于 2024-04-20 14:15:05

您可以动态创建一个新类,它既是WrapperFoo的子类,因此您将拥有所需的所有属性:

class Wrapper:
    def __new__(self, wrapped):
        cls = type(wrapped)
        new_type = type(cls.__name__ + '_wrapped', (Wrapper, cls), {})
        return object.__new__(new_type)

    def __init__(self, wrapped):
        self._wrapped = wrapped
    def __getattr__(self, name):
        return getattr(self._wrapped, name)

现在您可以:

^{pr2}$

附言:

  • 您不需要在__init____getattr__函数中使用object.__getattr__(或__setattr__)来获取和设置此属性。在
  • 您可能需要缓存此操作,以避免在每个新对象上创建新类。在

相关问题 更多 >