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

Python 将属性修饰成员复制到新类,python,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('__'):

我试图将所有方法和属性从一个类复制到另一个类的实例。不幸的是,我的财产有问题。下面是一个例子:

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!'
,但它返回


请注意,这类似于mixin,但我希望它在实例而不是类上工作。

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

可能有一种方法可以用更少的“魔法”来完成您想要的,但是可以更改实例的类

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!

你想解决什么问题?汉斯:不行。我想要的是将它保留为@property,所以即使它工作了,也不是我想要的。@SvenMarnach我想创建一个动态混合(可以在实例上工作),但它需要在新样式的类上工作。@Nova:这种魔法通常是不必要的。如果您真的想这样做,请使用动态创建的类型,而不是实例。还有一步:您需要这种动态混合做什么?您可以使用
setattr(b,item,types.MethodType(val,b))
让它与方法一起工作。不过,我找不到修复属性的方法。你知道,如果这种事情开始在野外出现,那将是你的错吗?:)我暗自希望有人能有组织地使用它……:)我以前尝试过类似的方法,但还有其他方法(我现在已经解决了)阻止了它的工作。你的例子更清楚了,谢谢!好的,事实证明,即使这个解决方案通常是有效的,但它不能与django模型一起使用,因为它最终会与内部使用
\uuuuuu class\uuuuuu
所做的奇特事情发生冲突。回到原点(