相关疑难解决方法(0)

用Python完全包装一个对象

我想完全包装一个对象,以便所有属性和方法请求转发到它包装的对象,但也覆盖我想要的任何方法或变量,以及提供我自己的一些方法.这个包装类应该作为现有类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__,所以我不知道如何获得这一权利.

python reflection

33
推荐指数
3
解决办法
1万
查看次数

在运行时覆盖__setattr__

我试图覆盖__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)

python

16
推荐指数
2
解决办法
3948
查看次数

标签 统计

python ×2

reflection ×1