Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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 super和设置父类属性_Python_Super - Fatal编程技术网

Python super和设置父类属性

Python super和设置父类属性,python,super,Python,Super,我在Python super()以及继承和属性方面遇到了一个非常奇怪的问题。首先,守则: #!/usr/bin/env python3 import pyglet import pygame class Sprite(pyglet.sprite.Sprite): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.rect = pygame.Rect(

我在Python super()以及继承和属性方面遇到了一个非常奇怪的问题。首先,守则:

#!/usr/bin/env python3

import pyglet
import pygame

class Sprite(pyglet.sprite.Sprite):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.rect = pygame.Rect(0, 0, self.width, self.height)
        self.rect.center = self.x, self.y

    @property
    def x(self):
        return super().x

    @x.setter
    def x(self, value):
        super(Sprite, self.__class__).x.fset(self, value)
        self.rect.centerx = value

    @property
    def y(self):
        return super().y

    @y.setter
    def y(self, value):
        super(Sprite, self.__class__).y.fset(self, value)
        self.rect.centery = value
这个很好用。然而,我想要的(对我来说似乎是蟒蛇的东西)

即使这样也不行

super().x

获取值。在本例中,x是同时定义了fset和fget的超类的属性。那么为什么它不起作用呢?

我试图找到正确的语言来支持为什么这种行为是这样的,这样就不会给你一个“因为它只是”的答案。。。但这个问题似乎已经被问过不止一次了,它可以归结为
super()
的行为。您可以在此处看到2010年关于这一确切行为的讨论:

归根结底,它实际上只是归结为super()调用,只允许您直接访问getter,而不允许访问setter。必须通过
fset()
\uuuuu set\uuuu()
访问设定器。最简单的解释可能是“super()功能不支持它”。它将在“set”操作(因此是
fset()
方法调用)中解析“get”操作的属性功能,而不是左手赋值中的setter。正如您从本讨论线程的日期所看到的,自从引入
super()
以来,显然就是这样

也许其他人有更具体的技术原因,但坦率地说,我甚至不确定这是否重要。如果它不受支持,这是一个很好的理由。

super(type(self),type(self)).setter.fset(self,value)
是一个常见的解决方法,但是它不能充分处理多重继承,这可能会改变mro

尝试我的解决方案duper(下面的链接):
duper(super()).setter=value


我提出了一个错误:希望这个问题很快得到解决,这样这个问题就不再相关了。“它不被支持……一个足够好的理由”听起来像“因为它就是”@simonzack-我说过我不想给出这样的答案,也不想尽可能多地解释它的功能。还有一个避免超级的理由,哦,我没有看到OP说“这很好用。不过”,谢谢!
super().x