我想完全包装一个对象,以便所有属性和方法请求转发到它包装的对象,但也覆盖我想要的任何方法或变量,以及提供我自己的一些方法.这个包装类应该作为现有类100%出现(isinstance
必须表现得好像它实际上是类),但是子类化本身并不会削减它,因为我想包装一个现有的对象.Python中是否有一些解决方案可以做到这一点?我正在思考以下问题:
class ObjectWrapper(BaseClass):
def __init__(self, baseObject):
self.baseObject = baseObject
def overriddenMethod(self):
...
def myOwnMethod1(self):
...
...
def __getattr__(self, attr):
if attr in ['overriddenMethod', 'myOwnMethod1', 'myOwnMethod2', ...]
# return the requested method
else:
return getattr(self.baseObject, attr)
Run Code Online (Sandbox Code Playgroud)
但我不是那个熟悉的覆盖__getattr__
,__setattr__
并且__hasattr__
,所以我不知道如何获得这一权利.
我试图覆盖__setattr__
Python类的方法,因为每次实例属性更改其值时我都想调用另一个函数.但是,我不希望在该__init__
方法中出现这种情况,因为在此初始化期间,我设置了一些稍后将使用的属性:
到目前为止,我有这个解决方案,而不是__setattr__
在运行时覆盖:
class Foo(object):
def __init__(self, a, host):
object.__setattr__(self, 'a', a)
object.__setattr__(self, 'b', b)
result = self.process(a)
for key, value in result.items():
object.__setattr__(self, key, value)
def __setattr__(self, name, value):
print(self.b) # Call to a function using self.b
object.__setattr__(self, name, value)
Run Code Online (Sandbox Code Playgroud)
但是,我想避免这些object.__setattr__(...)
并__setattr__
在__init__
方法结束时覆盖:
class Foo(object):
def __init__(self, a, b):
self.a = a
self.b = b
result = self.process(a)
for key, value in result.items():
setattr(self, key, value)
# override self.__setattr__ here …
Run Code Online (Sandbox Code Playgroud)