当前位置: 首页 > 面试题库 >

Python超级和设置父类属性

蒋永宁
2023-03-14
问题内容

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

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



 类似资料:
  • 我有以下课程 < li >抽象类duck 此类具有< code>flyBehavoir类型的< code>FlyBehavoir 函数,以执行flying < code > preformFly() < br >函数来设置< code > flyBehavoir < code > setFlyBrhavoir(flyBehavoir$flyBehavoir) < li >类DonaldDuck扩展

  • 问题内容: 我有及其继承的类。如何从课程中获取属性? 举例来说,让这些和对象: 我想做一些事情,例如: 并得到。我怎样才能做到这一点? 问题答案: 你不能。 实例仅继承父类的方法和属性,而不继承 实例 属性。您不应混淆两者。 是 实例的实例 属性。本实例将有他们 自己 的副本属性。 通常,您将对构造函数进行编码以采用两个参数: 另一种方法是保留对实例的引用: 从那里不再继承。像这样使用它:

  • 问题内容: 下面的代码由于某种原因给我一个错误,有人可以告诉我这是什么问题。 基本上,我创建了2个Point&Circle类。Circle正在尝试继承Point类。 错误: 问题答案: 看起来您可能已经修复了原始错误,该错误是由错误消息所指示的,尽管您的修复稍有不正确,而不是应该使用的类。 请注意,在的方法中还有一个错误调用的地方: 这在Python 3上是有效的代码,但是在Python 2上需要

  • 我有两个从抽象类继承的类,它们有父子关系。 所以我使用了注释OneToOne和ManyToOne,但是子类中的父实体总是为空。有人能帮我吗,我花了几个小时谷歌和测试了许多conf,但没有成功。 这些是我的类中的代码: ... ... ... 如果我不添加@JoinCol列注释,JPA会创建一个关联表,但无法检索父级,而关联可以直接通过在数据库中请求来完成。 非常感谢你的帮助。 祝好

  • 问题内容: 因此,我在回答这个问题的同时一直在使用Python,但发现这是无效的: 由于 。但是,对于从对象继承的任何类,它都是有效的: 打印将按预期显示“ hello”。为什么会这样呢?在Python语言规范中,有哪些规定不能将属性分配给香草对象? 问题答案: 为了支持任意属性分配,对象需要一个:与对象关联的字典,可以在其中存储任意属性。否则,就无处放置新属性。 的实例object并没有随身携带

  • 问题内容: 那么是否可以仅针对最特定的类获取属性的字典/列表?到目前为止,我正在使用 但这也将给我提供超类中定义的服装。有什么办法可以避免这种情况? 问题答案: 摘自python文档 类具有由字典对象实现的名称空间。类属性引用将转换为此字典中的查找,例如Cx被转换为C . dict [“ x”](尽管特别是对于新式类,有许多允许使用其他方式定位属性的钩子)。如果找不到属性名称,则在基类中继续搜索属