2

クラスから別のクラスのインスタンスにすべてのメソッドと属性をコピーしようとしています。残念ながら、プロパティに問題があります。次に例を示します。

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 に似ていることに注意してください。ただし、クラスではなくインスタンスで動作するようにしたいと考えています。

4

2 に答える 2

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!
于 2012-06-15T15:37:56.370 に答える
0

プロパティ (およびより一般的には記述子) は、インスタンスではなく型に対してのみ機能するため、これは機能しません。プロパティだけでなく、メソッドでも問題が発生します。これは、アプローチがパラメーターの暗黙的な受け渡しを中断するためselfです。

于 2012-06-15T15:02:10.610 に答える