如何解决如何在python中正确扩展setter?
我在寻找子类python类时扩展属性设置器的一种方法。我看了there和there,但提供的答案似乎很复杂,或者没有涵盖扩展设置器的范围,而不是覆盖设置的范围。 >它。由于这些问题都比较老,我认为也许有更好的方法可以覆盖二传手。
查看文档中的here,我发现属性具有fget
,fset
和fdel
属性,分别引用getter,setter和deleter方法。使用它,我提出了以下解决方案。
class Parent:
def __init__(self,x):
self.x = x
@property
def x(self):
return self._x
@x.setter
def x(self,new_x):
print('This is Parent\'s setter')
self._x = new_x
class Child(Parent):
@Parent.x.setter
def x(self,new_x):
Parent.x.fset(self,new_x)
print('This is Child\'s setter')
test = Child(0)
运行脚本,我得到输出
This is Parent's setter
This is Child's setter
这正是我所期望的。
该解决方案似乎可行,但我觉得应该有一个更好的解决方案,因为在子类的设置器中硬编码父类的名称并显式使用{{1} }作为参数。有更好的方法吗?例如,是否有一种方法可以使用self
做类似的事情?在子类中扩展setter的标准方法是什么?
解决方法
如果您想使用super
,它将如下所示:
class Child(Parent):
@property
def x(self):
return super().x
@x.setter
def x(self,new_x):
super(Child,type(self)).x.fset(self,new_x)
print("This is Child's setter")
super
实现了一种__getattribute__
方法,但没有实现__setattr__
,因此我们无法执行super().x = new_x
。我们可以使用super
来查找父对象的属性对象,但是在setter中,这就是我们所能做的。
以这种方式做事几乎没有好处。如果两个子类要合作重写同一个属性,但正确地进行多重继承要比在各处仅使用super
要复杂得多,这在某些多重继承情况下可能很有用。
(将type(self)
传递到super
几乎总是错误的,但是那是当您将其作为第一个参数传递时。super(type(self),self)
在存在孙类的情况下中断了。传递{{ 1}}作为第二个参数很有意义,如果您想使用type(self)
在实例方法中查找类属性,这就是我们在这里所做的。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。