Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中正确扩展setter?_Python_Inheritance_Properties - Fatal编程技术网

如何在python中正确扩展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

我正在寻找一种在对python类进行子类化时扩展属性setter的方法。我看了看,但提供的答案似乎很复杂,或者没有涵盖扩展setter而不是覆盖setter的情况。因为这些问题已经很老了,我想也许有更好的方法来推翻二传手

查看文档,我发现属性有
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
的评论。那么我的解决方案是可以接受的?有没有更好的方法来扩展二传手?