multiple method init__ herency comando __init__ python super

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?