# 我们有时候想在子类中定义一些父类没有的属性进行属性拓展 class Person: def __init__(self, name): self.name = name @property def name(self): return self._name @name.setter def name(self, name): if not isinstance(name, str): raise TypeError('name must be str') else: self._name = name @name.deleter def name(self): raise AttributeError('name cannot be deleted') # 我们从Person中继承,并对name属性的功能进行拓展 class SubPerson(Person): @property def name(self): print("Getting name...") return super().name @name.setter def name(self, value): print("Setting name to {}...".format(value)) super(SubPerson, SubPerson).name.__set__(self, value) @name.deleter def name(self): print("Deleting name...") super(SubPerson, SubPerson).name.__delete__(self) # s = SubPerson("Guido") # s.name # s.name = "Larry" # s.name = 42 # 如果只是想拓展属性的其中一个方法,可以使用如下代码实现 # 只修改setter class SubPerson2(Person): # 指定父类中属性的某种方法 @Person.name.setter def name(self, value): print("Setting name to {}...".format(value)) super(SubPerson2, SubPerson2).name.__set__(self, value) s2 = SubPerson2("Guido2") s2.name = "Larry" #只修改getter class SubPerson3(Person): # 我们也可以这样操作 @Person.name.getter def name(self): print('Getting name .....') return super().name s3 = SubPerson3("Guido3") s3.name s3.name = "Larry" s3.name # Python3让我们太舒服了,super的本质是super(类名, self),这些参数被省略了,它的意思其实是从self的MRO列表里寻找类名的下一个位置 # 所以这里的 super(SubPerson, SubPerson).name 其实是在SubPerson的MRO列表中寻找SubPerson的下一个类,用途是找到Person # 万万记住,这种方式一次只能修改一个方法,如果一次修改多个,生效的只有最后被定义的那个 #比如这里生效的只有setter class SubPerson4(Person): # 我们也可以这样操作 @Person.name.getter def name(self): print('Getting name .....') return super(SubPerson4, SubPerson4).name.__get__(self) @Person.name.setter def name(self, value): print("Setting name to {}...".format(value)) super(SubPerson4, SubPerson4).name.__set__(self, value) s4 = SubPerson4("Guido4") s4.name s4.name = "Larry" s4.name