2017-12-27 36 views
1

私はデコレータでクラスにミックスインを注入しようとしています。コードが実行されると、クラスにはのdictというプロパティがなくなりますが、dir(インスタンス)にはそのプロパティがあります。私は不動産がどこに消えているのか分かりません。 dictを取得する方法がありますか、そうでなければインスタンスの属性を見つけることができますか?Pythonオブジェクトがmixin注入後に__dict__を失う

def testDecorator(cls): 
    return type(cls.__name__, (Mixin,) + cls.__bases__, dict(cls.__dict__)) 

class Mixin:   
    pass 

@testDecorator 
class dummyClass: 
    def __init__(self): 
     self.testVar1 = 'test' 
     self.testVar2 = 3.14 

inst = dummyClass() 
print(dir(inst)) 
print(inst.__dict__) 

このコードは、デコレータがコメントアウトされていても、デコレータが存在するときにエラーが発生した場合に機能します。 Pythonで動く3.5.1

答えて

3

「失うのは__dict__」ではありません。元のdummyClass__dict__descriptorというオリジナルのインスタンスの__dict__属性を取得することを意図していますが、デコレータはそのデスクリプタを元のものに戻らない新しいdummyClassに置きます。

継承関係がないため、新しいクラスのインスタンスがメモリレイアウト内の異なるオフセットにdictポインタを持つ可能性があるため、元の__dict__記述子を新しいクラスのインスタンスで使用することは安全ではありません。この問題を解決するには、あなたのデコレータではなく、その辞書と拠点をコピー元から下降したクラスを作成しています

def testDecorator(cls): 
    return type(cls.__name__, (Mixin, cls), {}) 
+1

は単にtype'が 'に渡されるマッピングから__dict__'も働く'切除(新しい '__dict__'をディスクリプタは自動的に作成されます)。 '__weakref__'も削除することをお勧めします。 – BrenBarn

+0

さて、 'Mixin'は独自の' __dict__'記述子を持っていますので、新しいものを作成する代わりにそのものを使用しますが、 '__dict__'を削除すると動作するはずです。 – user2357112

関連する問題