我遇到了一个奇怪的问题。请看下面我粘贴的代码。 在myclass中我有一个@property datef。 我可以设置获得财产; 但是当我从mybase继承myclass时, 我不能再设置属性了。 为什么呢?
class mybase(object):
pass
class myclass(mybase):
@property
def dataf(self): return 1
var = myclass()
print var.dataf
var.dataf = 33
print var.__dict__
答案 0 :(得分: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}
答案 1 :(得分:1)
带有新式类的@property装饰器only works properly。
如果你试过
class myclass:
@property
def dataf(self): return 1
然后myclass
是一个旧式的类,所以不要指望@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}