Python super 和设置父类属性

2024-04-03

我在 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 http://mail.python.org/pipermail/python-dev/2010-April/099672.html

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python super 和设置父类属性 的相关文章

随机推荐

  • 使表格行的背景延伸到表格边界之外

    我目前正在尝试创建一个带有斑马条纹的表格 其中条纹的背景颜色延伸到屏幕的整个长度 但行的实际内容保留在表格的边界内 更具体地说 我正在使用 Bootstrap 所以我想要的是表行的内容就像它们位于 container 本质上 我正在尝试创建
  • ASP.Net MVC 显示格式

    在我的模型中 我的属性之一有以下 DataAnnotations Required ErrorMessage DisplayFormat DataFormatString 0 d DataType DataType Date public
  • ant/Jenkins:move不支持“安静”属性

    我的构建脚本执行
  • 如何使用主干单页应用程序在 MVC4 中测试 AntiForgeryToken

    我在获取 Microsoft 的 MVC 时遇到问题 ValidateAntiForgeryToken 使用使用 Marionette Backbone 编写的单页应用程序 SPA 问题似乎是MVC ValidateAntiForgeryT
  • 为什么 S4 类的 print 调用 `show` 时没有命名空间?

    我有一个包裹shinyjs带有一个名为show 今天 一位用户向我报告 这在使用 S4 对象时会带来问题 因为 打印 S4 对象使用show方法 它在附加时被我的包屏蔽 Example library shinyjs setClass te
  • 使用 Homebrew 在 Mac OS X 上安装 libRmath

    我想安装libRmath dylib在 Mac OS X Mavericks 上最好使用 Homebrew 因为我已经使用了这个包管理器 我没有找到公式libRmath 但我确实找到了一个公式R所以我尝试扩展它 请参阅最后的整个文件 Als
  • 使用 JULI 登录 tomcat 7 的特定应用程序?

    我在 tomcat 7 中使用 java 系统日志记录 但没有日志记录语句写入日志 我已将此文件添加到我的 WEB INF classes 中 创建了日志文件 new xyz test 因此我至少有一些正确的配置 但它是空的 没有日志语句打
  • 使用 argmax 从 Tensor 获取值

    我有一个Tensor形状的 60 128 30000 我想得到的值argmax of the 30000方面 axis 2 此代码是一个示例 tensor tf random uniform 60 128 30000 shape 60 12
  • 为多个组生成不同颜色的 ggplot2 箱线图

    我对 R 和 ggplot 相当陌生 我正在尝试生成按两个变量排序的箱线图 就我而言 物种和实验 到目前为止我通过使用得到了什么 ggplot DF aes Species Protein fill Experiment dodge Exp
  • 如何将 jsdom.jQueryify 与 jasmine-node 一起使用?

    是否可以使用 jsdom 的 jQueryify 功能来使用 jasmine node 我想做的是使用 NodeJS 来测试一些依赖于 DOM 是否存在的 JavaScript 这是我尝试过的简化案例 当我运行脚本时 茉莉花节点识别规范 但
  • 如何以编程方式在 xml 配置文件中的某些位置添加节点

    我们的软件安装在 50 台客户端 PC 上 软件从 xml 配置文件中选取值 每个客户端在配置文件中都有自己的个人节点值 真 假 现在我们发布了新版本的软件 在 xml 配置文件中添加了更多节点 我们如何将新节点添加到客户端现有的配置文件
  • TaskDescription 的主要颜色应该是不透明的 Android 6.0

    我的代码是 if Build VERSION SDK INT gt Build VERSION CODES LOLLIPOP Bitmap bm BitmapFactory decodeResource context getResourc
  • 查找与布尔查询匹配的大型 int 数组子集的算法

    假设我有一个 M 32 位整数的大数组 其中每个值的设置不超过 N 位 现在我想返回与查询 Target AND Value Target 匹配的子集 即目标位出现在数组值中设置的值 暴力破解很简单 只需迭代数组并提取其中 target v
  • Unison:仅在一个方向上同步

    如果我有文件夹 A 和 B 是否可以将新文件从 A 同步到 B 并且不删除 B 中的文件而删除 A 中的文件 也就是说 我想用B作为任何文件的大容器 包括我曾经从A同步然后删除的文件 我认为这被认为是一种 单向同步 我了解您对 Unison
  • 在 eclipse 中使用 java.io 库,以便 FileInputStream 可以读取 dat 文件

    Goal Print the data from a dat file to the console using Eclipse 长期目标 我可以将 dat 文件传递 给可执行文件 它会创建一个带有格式化数据的新 txt 文件 The da
  • jQuery Dragenter 或 Dragover 包含子项

    我目前正在编写一个上传脚本 当然它具有拖放功能 However当我将文件拖到我的元素上时 我试图让它工作 它添加了类拖累然而 因为我的元素有孩子 所以它会不断地触发 因为它进入和离开元素 我想知道什么我怎样才能扩展 dragenter dr
  • 在 Visual Studio 中查看 var 的类型

    有没有办法查看 a 的类型var在 Visual Studio 2013 代码编辑器中 当我有一个疯狂的时候linq查询 很高兴看到结果类型是什么 我不想更换var关键字与实际类型 我只想看看它是什么 还有一个键盘快捷键会向您显示 将光标放
  • Java GUI repaint() 问题?

    我有一个 JFrame 该 JFrame 包含一个 JButton 我单击 JButton 然后创建了 10 个 JTextField 问题 在通过调整窗口大小 强制重新绘制 之前我看不到它们 只有这样我才能看到创建的 JTextField
  • 安装补丁 19 后,Oracle Forms 6i 在启动时崩溃并显示 0xC0000005 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 UPD 0xC0000005 是STATUS ACCESS VIOLATION 在 winnt h 中定义 这意味着应用程序尝试访问它无法
  • Python super 和设置父类属性

    我在 Python super 以及继承和属性方面遇到了一个非常奇怪的问题 首先 代码 usr bin env python3 import pyglet import pygame class Sprite pyglet sprite S