python类继承影响属性?

时间:2012-07-26 21:53:14

标签: python inheritance properties

我遇到了一个奇怪的问题。请看下面我粘贴的代码。 在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__

2 个答案:

答案 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}