简体   繁体   English

python类继承会影响属性吗?

[英]python class inherit affects property?

I met a weird issue. 我遇到了一个奇怪的问题。 please see the code I paste below. 请参阅下面粘贴的代码。 in myclass I have a @property datef. 在myclass中,我有一个@property datef。 I can set get the property; 我可以设置获取属性; but when I make myclass inherit from mybase, I cannot set the property any more. 但是当我使myclass从mybase继承时,我无法再设置该属性。 Why? 为什么?

class mybase(object):
    pass

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

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

You need to define property getter and 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}

The @property decorator only works properly with new-style classes. @property装饰器仅适用于新样式的类。

If you tried 如果你尝试过

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

then myclass is an old-style class, so don't expect @property to work properly. 那么myclass是一个老式的类,因此不要期望@property正常工作。

When instead you make myclass a subclass of mybase which in turn inherits from object , you are making myclass a new-style class. 相反,当您将myclass mybase的子类,而mybase的子类又继承自object ,您使myclass成为新样式的类。 Now @property works properly. 现在@property可以正常工作。

Now you need to define a setter if you wish to be able to set the 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__

yields 产量

1
{'_dataf': 33}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM