小编典典

Python超级和设置父类属性

python

我在使用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

这很好。但是,我想要的(对我来说似乎是Pythonic)

#super(Sprite, self.__class__).x.fset(self, value)
super().x = value

即使不起作用

super().x

得到很好的价值。在这种情况下,x是同时定义了fset和fget的超类的属性。那为什么不起作用呢?


阅读 209

收藏
2020-12-20

共1个答案

小编典典

我试图找到正确的语言来支持这种行为的原由,以免给您一个“因为它就是”答案……但是似乎这个问题已经被问了不止一次了,并且它归结为的行为super()。您可以在此处查看有关此确切行为的2010年讨论:http : //mail.python.org/pipermail/python-
dev/2010-April/099672.html

最终,它实际上只是归结为super()调用,只允许您直接访问getter,而不是setter。设置者必须通过fset()或访问__set__()。可能最容易解释为“
super()功能只是不支持它”。它将在“设置”操作中解决“获取”操作的属性功能,而不是左手分配中的设置器(因此将fset()调用方法)。从讨论线程的日期可以看出,自引入以来,显然是这种方式super()

也许其他人有更具体的技术原因,但坦率地说,我不确定这是否重要。如果不支持,那就足够了。

2020-12-20