Python中的属性继承问题

时间:2013-12-13 13:51:23

标签: 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

当我遇到这个问题时,我没有时间找到答案,我只是使用普通的getter和setter或重新考虑我的逻辑,所以我不需要覆盖访问器,但现在我想回答我的问题并且在一些书中学习,到目前为止我只发现了这种方法:

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装饰可以解决这个问题吗?

1 个答案:

答案 0 :(得分:5)

class Mr(Person):

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