我在使用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的超类的属性。那为什么不起作用呢?
我试图找到正确的语言来支持这种行为的原由,以免给您一个“因为它就是”答案……但是似乎这个问题已经被问了不止一次了,并且它归结为的行为super()。您可以在此处查看有关此确切行为的2010年讨论:http : //mail.python.org/pipermail/python- dev/2010-April/099672.html
super()
最终,它实际上只是归结为super()调用,只允许您直接访问getter,而不是setter。设置者必须通过fset()或访问__set__()。可能最容易解释为“ super()功能只是不支持它”。它将在“设置”操作中解决“获取”操作的属性功能,而不是左手分配中的设置器(因此将fset()调用方法)。从讨论线程的日期可以看出,自引入以来,显然是这种方式super()。
fset()
__set__()
也许其他人有更具体的技术原因,但坦率地说,我不确定这是否重要。如果不支持,那就足够了。