복붙노트

[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

이것은 잘 작동합니다. 그러나, 내가 원하는 것 (나에게 파이썬으로 보이는 것)

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

비록

super().x

값을 잘 얻는다. 이 경우 x는 fset과 fget가 정의 된 수퍼 클래스의 속성입니다. 그럼 왜 작동하지 않습니까?

해결법

  1. ==============================

    1.나는이 행동이 왜 그런지를 뒷받침 할 정확한 언어를 찾으려고 노력했다. 그래서 "단지 그것이 있기 때문에"당신에게 대답을주지 않기 위해서였다. 그러나이 질문은 한 번 이상 물어 보았다. 그것은 super ()의 행동으로 귀결된다. 이 정확한 동작에 대한 2010 토론은 http://mail.python.org/pipermail/python-dev/2010-April/099672.html에서 확인할 수 있습니다.

    나는이 행동이 왜 그런지를 뒷받침 할 정확한 언어를 찾으려고 노력했다. 그래서 "단지 그것이 있기 때문에"당신에게 대답을주지 않기 위해서였다. 그러나이 질문은 한 번 이상 물어 보았다. 그것은 super ()의 행동으로 귀결된다. 이 정확한 동작에 대한 2010 토론은 http://mail.python.org/pipermail/python-dev/2010-April/099672.html에서 확인할 수 있습니다.

    궁극적으로 super () 호출은 setter가 아닌 getter에 직접 액세스 할 수있게 해줍니다. setter는 fset () 또는 __set __ ()를 통해 액세스해야합니다. 아마도 "super () 기능 만 지원하지 않습니다"라고 쉽게 설명 할 수 있습니다. "set"연산 (따라서 fset () 메서드 호출)에서 왼손잡이 지정의 setter가 아닌 "get"연산의 속성 기능을 해결합니다. 이 토론 스레드의 날짜에서 알 수 있듯이 super ()가 도입 된 이래로 분명히 이렇게되었습니다.

    어쩌면 다른 누군가가 기술적으로 더 구체적인 이유가있을 수 있지만 솔직히 나는 그것이 중요하지 않을 지 모른다. 지원되지 않는다면 충분히 좋은 이유가 있습니다.

  2. from https://stackoverflow.com/questions/10810369/python-super-and-setting-parent-class-property by cc-by-sa and MIT license