如何在python中正确扩展setter?
我正在寻找一种在对python类进行子类化时扩展属性setter的方法。我看了看,但提供的答案似乎很复杂,或者没有涵盖扩展setter而不是覆盖setter的情况。因为这些问题已经很老了,我想也许有更好的方法来推翻二传手 查看文档,我发现属性有如何在python中正确扩展setter?,python,inheritance,properties,Python,Inheritance,Properties,我正在寻找一种在对python类进行子类化时扩展属性setter的方法。我看了看,但提供的答案似乎很复杂,或者没有涵盖扩展setter而不是覆盖setter的情况。因为这些问题已经很老了,我想也许有更好的方法来推翻二传手 查看文档,我发现属性有fget、fset和fdel属性,这些属性涉及getter、setter和deleter方法。利用这一点,我提出了以下解决方案 class Parent: def __init__(self, x): self.x = x
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)
运行脚本,我得到输出
这是家长的setter
这是一个孩子的setter
这正是我所期望的
这个解决方案似乎有效,但我觉得应该有更好的解决方案,因为在子类的setter中硬编码父类的名称,并显式使用
self
作为参数似乎很奇怪。有更好的方法吗?例如,是否有一种使用super
执行类似操作的方法?在子类中扩展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
实现了一个\uuuuu getattribute\uuuuuuu
方法,但是没有\uuuuuuuuu setattr\uuuuuuuuuuu
,所以我们不能执行super().x=new\ux
。我们可以使用super
来查找父对象的属性对象,但在setter中,这就是它能为我们做的一切
这样做没有什么好处。在某些多重继承情况下,如果两个子类希望协同重写同一属性,但正确地执行多重继承比在任何地方使用super
都要复杂得多,那么它可能很有用
(将
type(self)
传递给super
几乎总是错误的,但是当您将它作为第一个参数传递时。super(type(self),self)
在孙子类存在时中断。传递type(self)
如果您想使用super
在实例方法中查找类属性,那么第二个参数是有意义的,这就是我们在这里要做的。)感谢您对super
的评论。那么我的解决方案是可以接受的?有没有更好的方法来扩展二传手?