我想做一个与包装对象完全相同的包装类(还有一些特定异常)。我目前遇到的问题是内置功能。我如何将内置功能重定向到包装对象?
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'
您可以动态创建一个是Wrapper
和Foo
的子类的新类,因此您将拥有所有需要的属性:
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)
所以您可以做:
>>> foo = Wrapper(Foo(-1))
>>> abs(foo)
1
>>> type(foo)
<class '__main__.Foo_wrapped'>
ps:
- 您不需要
__init__
中的object.__getattr__
(或__setattr__
),并且__getattr__
功能可以获取并设置此属性。 - 您可能需要缓存此操作,以避免在每个新对象上创建一个新类。