27

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 の両方が定義されたスーパークラスのプロパティです。では、なぜうまくいかないのでしょうか。

4

2 に答える 2

22

なぜこの振る舞いがそのようになっているのかを裏付ける正しい言語を見つけようとしていたので、「ただそうだから」という答えをあなたに与えないようにしていました...しかし、この質問は複数回尋ねられたようです.の動作に要約されsuper()ます。この正確な動作に関する 2010 年の議論は、http: //mail.python.org/pipermail/python-dev/2010-April/099672.htmlで確認できます。

最終的には、setter ではなく getter に直接アクセスできるようにするだけの super() 呼び出しに行き着きます。fset()セッターには、またはからアクセスする必要があります__set__()。おそらく、「super() 機能はサポートしていない」と説明するのが最も簡単です。これは、左利き代入のセッターではなく、「設定」操作 (したがってfset()メソッド呼び出し) の「取得」操作のプロパティ機能を解決します。このディスカッション スレッドの日付からわかるように、super().

他の誰かがより具体的な技術的な理由を持っているのかもしれませんが、率直に言って、それが重要であるかどうかはわかりません. サポートされていない場合、それは十分な理由です。

于 2012-05-30T05:38:33.053 に答える