gpt4 book ai didi

Python super 和设置父类属性

转载 作者:IT老高 更新时间:2023-10-28 20:41:39 26 4
gpt4 key购买 nike

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

得到很好的值(value)。在这种情况下,x 是定义了 fset 和 fget 的父类(super class)的属性。那么为什么它不起作用呢?

最佳答案

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

最终,它实际上只是归结为 super() 调用,只允许您直接访问 getter,而不是 setter。必须通过 fset()__set__() 访问 setter 。可能最简单的解释是“super() 功能不支持它”。它将在“set”操作中解析“get”操作的属性功能,而不是左手赋值中的setter(因此是 fset() 方法调用)。从这个讨论帖的日期可以看出,自从引入 super() 以来,显然是这样的。

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

关于Python super 和设置父类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10810369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com