Python super 和设置父类属性 [英] Python super and setting parent class property

查看:40
本文介绍了Python super 和设置父类属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 Python super() 以及继承和属性方面遇到了一个非常奇怪的问题.一、代码:

I'm having a really strange problem with Python super() and inheritance and properties. First, the code:

#!/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)

This works fine. However, what I want (what seems Pythonic to me)

#super(Sprite, self.__class__).x.fset(self, value)
super().x = value

尽管不起作用

super().x

得到很好的值.在这种情况下,x 是定义了 fset 和 fget 的超类的属性.那么为什么它不起作用呢?

gets the value fine. x in this case is a property of the superclass with both fset and fget defined. So why doesn't it work?

推荐答案

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

I was trying to find the correct language to back up why this behavior is the way it is, so as not to give you a "because it just is" answer... But it seems this question has been asked more than once, and that it boils down to the behavior of super(). You can see a 2010 discussion about this exact behavior here: http://mail.python.org/pipermail/python-dev/2010-April/099672.html

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

Ultimately, it really does just come down to super() calls only letting you access getters directly, and not setters. Setters must be accessed via fset() or __set__(). It is probably easiest explained as "super() functionality just doesn't support it". It will resolve the property functionality of a "get" operation, not the setter in a left handed assignment, in the "set" operation (hence the fset() method call). As you can see from the date of this discussion thread, its obviously been this way since the introduction of super().

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

Maybe someone else has a more specifically technical reason, but frankly I'm not sure it even matters. If its not supported, thats pretty much a good enough reason.

这篇关于Python super 和设置父类属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆