我对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
Run Code Online (Sandbox Code Playgroud)
这很好用.但是,我想要什么(对我来说似乎是Pythonic)
#super(Sprite, self.__class__).x.fset(self, value)
super().x = value
Run Code Online (Sandbox Code Playgroud)
虽然不起作用
super().x
Run Code Online (Sandbox Code Playgroud)
得到的价值很好.在这种情况下,x是超类的属性,同时定义了fset和fget.那为什么不起作用呢?
jdi*_*jdi 17
我试图找到正确的语言来支持为什么这种行为是这样的,以免给你一个"因为它只是"答案......但似乎这个问题不止一次被问到,它归结为的行为super().您可以在此处查看关于此确切行为的2010年讨论:http: //mail.python.org/pipermail/python-dev/2010-April/099672.html
最终,它确实只是让super()调用只让你直接访问getter而不是setter.必须通过fset()或访问Setter __set__().最简单的解释是"超级()功能只是不支持它".它将在"set"操作中解析"get"操作的属性功能,而不是左手赋值中的setter(因此fset()方法调用).从这个讨论主题的日期可以看出,自引入以来,它显然是这样的super().
也许其他人有更具体的技术原因,但坦率地说,我不确定它是否重要.如果它不受支持,这几乎是一个足够好的理由.