Acceso al atributo de la clase padre dentro de la clase hijo

Cuando accedo a un atributo de la clase principal a través de la clase secundaria, así funciona todo bien:

class A(): a=1 b=2 class B(A): c=3 d=B.a+B.b+Bc print d 

Pero si trato de acceder a un atributo de la clase principal dentro de la clase secundaria como este, no funciona:

 class A(): a=1 b=2 class B(A): c=3 d=a+b+c print d 

Recibo el error: el name 'a' is not defined

Supongamos que tengo muchas ecuaciones como d = a + b + c (pero más complicadas) y no puedo editarlas. Tengo que llamar a la clase B “a” como “a”, no “self.a” o “algo.a”. Pero puedo, antes de las ecuaciones, hacer Aa = a. Pero no es la forma más inteligente de recargar todas las variables manualmente. Quiero evitarlo usando herencia. ¿Es posible o debería hacer todo manualmente? O tal vez es la tercera ruta en este código?

Durante la definición de la clase, ninguno de los atributos heredados está disponible:

 >>> class Super(object): class_attribute = None def instance_method(self): pass >>> class Sub(Super): foo = class_attribute Traceback (most recent call last): File "", line 1, in  class Sub(Super): File "", line 2, in Sub foo = class_attribute NameError: name 'class_attribute' is not defined >>> class Sub(Super): foo = instance_method Traceback (most recent call last): File "", line 1, in  class Sub(Super): File "", line 2, in Sub foo = instance_method NameError: name 'instance_method' is not defined 

Ni siquiera puede acceder a ellos utilizando super , ya que el nombre de la subclase no está definido dentro del bloque de definición *:

 >>> class Sub(Super): foo = super(Sub).instance_method Traceback (most recent call last): File "", line 1, in  class Sub(Super): File "", line 2, in Sub foo = super(Sub).instance_method NameError: name 'Sub' is not defined 

La única forma de acceder a los atributos heredados en el momento de la definición es hacerlo explícitamente, utilizando el nombre de la superclase:

 >>> class Sub(Super): foo = Super.class_attribute >>> Sub.foo is Super.class_attribute True 

Alternativamente, puede acceder a ellos dentro de los métodos de clase o instancia, pero luego necesita usar el prefijo apropiado del parámetro de clase ( cls convencional) o instancia (convencionalmente self ).


* para cualquiera que piense “ah, pero en 3.x no necesitas argumentos para super :

 >>> class Sub(Super): foo = super().instance_method Traceback (most recent call last): File "", line 1, in  class Sub(Super): File "", line 2, in Sub foo = super().instance_method RuntimeError: super(): no arguments 

¡Eso solo es cierto dentro de los métodos de instancia / clase!

Puede que me equivoque en esto, pero ¿estás seguro de que no quieres esto?

 class A(object): def __init__(self): self.a = 1 self.b = 2 class B(A): def __init__(self): super(B, self).__init__() self.c = 3 @property def d(self): return self.a + self.b + self.c BB = B() print BB.d 

o, como jonrsharpe señaló:

 class A(): a=1 b=2 class B(A): c=3 d=A.a+A.b+c print Bd