2012-05-30 100 views
17

我有使用Python超()和繼承的特性真奇怪問題。首先,代碼:Python的超級設置父類屬性

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

這工作正常。不過,我想什麼(什麼似乎Python的我)

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

即使

super().x 

得到值精細不起作用。 x在這種情況下是定義了fset和fget的超類的屬性。那爲什麼它不工作?

回答

15

我試圖找到正確的語言來備份爲什麼這種行爲是事情是這樣的,以免給你一個「因爲它僅僅是」的答案......但似乎這個問題已經被問多比一次,並且歸結爲super()的行爲。你可以在這裏看到一個關於這個確切行爲的2010年討論:http://mail.python.org/pipermail/python-dev/2010-April/099672.html

最終,它確實只是回到super()調用,只允許你直接訪問getters,而不是setter。安裝人員必須通過或__set__()訪問。這可能是最簡單的解釋,因爲「super()功能不支持它」。這既解決了「獲得」操作的特性功能,而不是在左手分配的制定者,在「設置」操作(因此方法調用)。從本次討論的日期可以看出,自從super()推出以來,顯然是這樣。

也許別人有更具體的技術原因,但坦白說,我不知道它甚至事項。如果它不被支持,這幾乎是一個足夠的理由。

+6

我已經提交了一個錯誤:http://bugs.python.org/issue14965希望這很快解決,這樣這個問題不再是相關的。 – darkfeline

+0

「它不支持...一個足夠好的理由」聽起來像「因爲它就是」。 – simonzack

+0

@simonzack - 我確實說過我*試圖*不給出這樣的答案,並解釋我可能會對其功能最多。 – jdi