0

我遇到了一个奇怪的问题。请参阅我在下面粘贴的代码。在 myclass 我有一个@property datef。我可以设置获取属性;但是当我让 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

您需要定义属性 getter 和 setter:

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一个mybase继承自的子类时object,您正在创建myclass一个新型类。现在@property 可以正常工作。

现在,如果您希望能够设置属性,则需要定义一个 setter。

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 回答