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

时间:2012-06-15 14:58:47

标签: python

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

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,但我希望它能够用于实例而不是类。

2 个答案:

答案 0 :(得分:3)

可能有一种方法可以用较少的“魔法”来完成你想要的东西,但是可以改变一个实例的类......

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!

答案 1 :(得分:0)

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