Python中的属性继承问题

阿尔瓦罗·富恩特斯

前一段时间,我正在开发一个python应用程序,并且在类中使用了很多属性,但是当我尝试在派生类中重写基类的访问器的行为时,我遇到了麻烦。这是我的问题的草图:

class Person(object):

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        self._name = value


class Mr(Person):    

    @name.setter
    def name(self,value):
        self._name = "Mr. "+value



p = Person()
p.name = "John"

print p.name

m = Mr()
m.name = "John"

print m.name

当您运行它时,会出现以下错误:

Traceback (most recent call last):
  File "/home/user/Desktop/bad.py", line 20, in <module>
    class Mr(Person):    
  File "/home/user/Desktop/bad.py", line 22, in Mr
    @name.setter
NameError: name 'name' is not defined

当我遇到这个问题时,我没有时间找到答案,我只是使用简单的getters和setters或重新考虑我的逻辑,因此我不需要重写访问器,但是现在我试图回答我的问题并学习到目前为止,我只发现了一些方法:

class Person(object):

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        self._name = self._fix_name(value)

    def _fix_name(self,value):
        return value


class Mr(Person):    

    def _fix_name(self,value):
        return "Mr. "+value



p = Person()
p.name = "John"

print p.name

m = Mr()
m.name = "John"

print m.name

当我运行它时,我得到:

John
Mr. John

这就是我想要的,但是问题是_fix_name在类外部可以访问,除了它是我需要为要覆盖的每个属性访问器添加的额外方法,等等。

因此,问题是:是否有某种“好的”方法来做到这一点?或者,是否有任何PEP可以解决此问题?我认为某种@overrides装饰器可以解决问题?

crazyzubr
class Mr(Person):

    @Person.name.setter
    def name(self,value):
        self._name = "Mr. "+value

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章