将属性修饰成员复制到新类



我正在尝试将所有方法和属性从一个类复制到另一个类的实例。 不幸的是,我在属性方面遇到了问题。下面是一个示例:

class ToAdd(object):
    @property
    def foo(self):
        return 'foo!'
class Base(object):
    pass
b = Base()
for item, val in ToAdd.__dict__.iteritems():
    if not item.startswith('__'):
        setattr(b, item, val)

调用b.foo时,我希望得到'foo!',但它返回<property at 0x104a73d08>

请注意,这类似于 mixin,但我希望它适用于实例而不是类。

可能有一种方法可以用更少的"魔法"完成你想要的,但可以更改实例的类......

class ToAdd(object):
    @property
    def foo(self):
        return 'foo!'
class Base(object):
    pass
b = Base()
NewBase = type('NewBase', (Base, ToAdd), {})
b.__class__ = NewBase
print(b.foo)
# foo!
属性

(以及更一般的描述符)仅适用于类型,不适用于实例,因此这不起作用。 您不仅会遇到属性问题,还会遇到方法问题,因为您的方法会破坏 self 参数的隐式传递。

最新更新