1

次のコードに示すように、Python (2.7) クラスのメンバーをプロパティでオーバーライドしようとしていました。

class Base:
    def __init__(self):
        self.foo = 1

class Derived(Base):
    foo = property(lambda self: 2)

print Derived().foo

ただし、最後の行は 2 ではなく 1 を出力します。プロパティが機能するはずだと思っていた方法 (つまり、メンバーを後で関数に簡単に変更する) からすると、これは直感に反するように思えます。何か不足していますか?回避策はありますか?

4

1 に答える 1

9

新しいスタイルのクラスを使用していないため、これは機能しません。プロパティはdescriptors、新しいスタイルのクラスでのみ機能します。あなたのコードがしていることはこれです:

Derivedclass 属性を持つクラスを作成しますfoo。次に、クラスのインスタンスを作成すると、Base.__init__継承Derivedがないため、クラス属性に優先する__init__インスタンス属性を追加します。foo

変更する場合:

class Base: #old style class

に:

class Base(object):  #new style class

setter主に、プロパティに が適切に定義されていないという、まったく新しい問題に遭遇しself.foo = 1ますBase.__init__AttributeError

于 2013-01-22T20:03:03.310 に答える