0

奇妙な問題に遭遇しました。以下に貼り付けるコードをご覧ください。myclassには、@propertydatefがあります。プロパティを取得するように設定できます。しかし、myclassをmybaseから継承させると、プロパティを設定できなくなります。なんで?

class mybase(object):
    pass

class myclass(mybase):
    @property     
    def dataf(self): return 1

var = myclass()
print var.dataf
var.dataf = 33
print var.__dict__
4

2 に答える 2

3

プロパティゲッターとセッターを定義する必要があります。

class mybase(object):
    pass

class myclass(mybase):
    def dataf_get(self): return getattr(self, "_data_f", None)
    def dataf_set(self, value): self._data_f = value
    dataf = property(dataf_get, dataf_set)

var = myclass()
print var.dataf
>> None
var.dataf = 33
print var.dataf
>> 33
print var.__dict__
>> {'_data_f': 33}
于 2012-07-26T22:01:41.460 に答える
1

@propertyデコレータは、新しいスタイルのクラスでのみ適切に機能します。

あなたが試した場合

class myclass:
    @property     
    def dataf(self): return 1

thenmyclassは古いスタイルのクラスなので、@propertyが正しく機能することを期待しないでください。

代わりに、から継承するmyclassサブクラスを作成すると、新しいスタイルのクラスが作成されます。これで、@propertyが正しく機能します。mybaseobjectmyclass

プロパティを設定できるようにする場合は、セッターを定義する必要があります。

class mybase(object):
    pass

class myclass(mybase):
    @property     
    def dataf(self): return 1

    @dataf.setter
    def dataf(self, value):
        self._dataf = value

var = myclass()
print var.dataf
var.dataf = 33
print var.__dict__

収量

1
{'_dataf': 33}
于 2012-07-26T22:01:43.943 に答える