method - Propiedad de clase padre y super Python
super class self__ init__ python (1)
Estaba tratando de encontrar el lenguaje correcto para respaldar por qué este comportamiento es como es, para no darle una respuesta "porque solo es" ... Pero parece que esta pregunta se ha hecho más de una vez, y que se reduce al comportamiento de super()
. Puede ver una discusión de 2010 sobre este comportamiento exacto aquí: http://mail.python.org/pipermail/python-dev/2010-April/099672.html
En última instancia, realmente se reduce a llamadas super () que solo te permiten acceder a los captadores directamente, y no a los configuradores. Se debe acceder a los fset()
través de fset()
o __set__()
. Probablemente se explica más fácilmente como "la funcionalidad super () simplemente no lo admite". Resolverá la funcionalidad de la propiedad de una operación "obtener", no el configurador en una asignación de zurdos, en la operación "establecer" (de ahí la llamada al método fset()
). Como puede ver en la fecha de este hilo de discusión, obviamente ha sido así desde la introducción de super()
.
Tal vez alguien más tenga una razón más específicamente técnica, pero francamente no estoy seguro de que eso importe. Si no es compatible, esa es una razón bastante buena.
Estoy teniendo un problema realmente extraño con Python super () y la herencia y las propiedades. Primero, el código:
#!/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
Esto funciona bien. Sin embargo, lo que quiero (lo que me parece Pythonic)
#super(Sprite, self.__class__).x.fset(self, value)
super().x = value
no funciona aunque
super().x
obtiene el valor bien. En este caso, x es una propiedad de la superclase con fset y fget definidos. Entonces, ¿por qué no funciona?