No puede.
Una definición de clase funciona en Python funciona de la siguiente manera.
El intérprete ve una instrucción class
seguida de un bloque de código.
Crea un nuevo espacio de nombres y ejecuta ese código en el espacio de nombres.
Llama al type
incorporado con el espacio de nombres resultante, el nombre de clase, las clases base y la metaclase (si corresponde).
Asigna el resultado al nombre de la clase.
Mientras ejecuta el código dentro de la definición de clase, no sabe cuáles son las clases base, por lo que no puede obtener sus atributos.
Lo que puede hacer es modificar la clase inmediatamente después de haberla definido.
EDITAR: aquí hay un pequeño decorador de clases que puede usar para actualizar el atributo. La idea es darle un nombre y una función. Examina todas las clases base de su clase y obtiene sus atributos con ese nombre. Luego llama a la función con la lista de valores heredados de la clase base y el valor que definió en la subclase. El resultado de esta llamada está vinculado al nombre.
Código podría tener más sentido:
>>> def inherit_attribute(name, f):
... def decorator(cls):
... old_value = getattr(cls, name)
... new_value = f([getattr(base, name) for base in cls.__bases__], old_value)
... setattr(cls, name, new_value)
... return cls
... return decorator
...
>>> def update_x(base_values, my_value):
... return sum(base_values + [my_value], tuple())
...
>>> class Foo: x = (1,)
...
>>> @inherit_attribute('x', update_x)
... class Bar(Foo): x = (2,)
...
>>> Bar.x
(1, 2)
La idea es que se define x
ser (2,)
en Bar
. El decorador irá y mirará a través de las subclases de Bar
, encontrará todos sus x
s, y llamará al update_x
con ellos. Así se llamará
update_x([(1,)], (2,))
los combina mediante la concatenación de ellos, entonces se une de nuevo a que x
nuevo. ¿Tiene sentido?
Tenga en cuenta que las metaclases secuestran # 3, e incluso pueden modificar 'bases' antes de pasarlo a' tipo'. Entonces sí, no puedes. – delnan
Sí, eso tiene sentido. Pensé en eso yo mismo (a través de metaclases), pero extender una lista heredada fue solo un ejemplo. Es posible que desee eliminar algunos elementos de la lista en lugar de ampliarlos. O no tiene una lista sino otro tipo ... ¡Gracias por la amplia respuesta! – warvariuc
He oído en Ruby que puedes acceder a la clase antes de que estuviera completamente definida ... – warvariuc