No puedo hacer que super () funcione en Python 2.7

Con un simple par de clases, no puedo trabajar super:

class A(object): q = 'foo' class B(A): q = 'bar' def __init__(self): self.a = super(A, self).q a = B() 

errores como tal:

 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last)  in () 5 def __init__(self): 6 self.a = super(A, self).q ----> 7 a = B()  in __init__(self) 4 q = 'bar' 5 def __init__(self): ----> 6 self.a = super(A, self).q 7 a = B() AttributeError: 'super' object has no attribute 'q' 

He revisado problemas similares en el intercambio de stacks, leí documentación y artículos, y por todas las cuentas esto debería estar funcionando. ¿Qué cosa obvia me estoy perdiendo?

EDITAR: La respuesta es que me estoy refiriendo a la clase equivocada, y corregirlo corrige el ejemplo, pero no mi código real, que se encuentra a continuación:

 class D(object): pwd = ['~/'] def __init__(self,*args): if len(args) == 1: self.cd(args[0]) else: return def __str__(self): if len(self.pwd) == 1: return self.pwd[0] else: return ''.join(self.pwd) def __add__(self,other): if type(other) is str: return str(self) + other elif type(other) is list: return pwd + other def cd(self, directory): #import pdb; pdb.set_trace() reset = False if directory[0] is '~': reset = True if directory[0] is '/': reset = True directory = directory[1:] if directory[-1] is '/': directory = directory[:-1] directory = [folder+'/' for folder in directory.split('/')] rverse = directory.count('../') if rverse > 0 and type(directory) is list: end = False for folder in directory: if folder == '../' and end: raise Exception('improperly placed ".."') if folder != '../': end = True if reset: self.pwd = directory else: self.pwd = self.pwd + directory print self class Dirchanger(D): def __init__(self,client,*args): if len(args) == 1: self.cd(args[0]) def cd(self,directory): super(D, self).cd(directory) 

Obviamente, ese código está incompleto, pero debería funcionar según la respuesta.

Está utilizando el objective de búsqueda incorrecto (el primer argumento); usa super(B, self) lugar:

 def __init__(self): self.a = super(B, self).q 

El primer argumento le da a super() un punto de partida; significa mirar a través del MRO, comenzando en la siguiente clase después de la que te di , donde MRO es el orden de resolución del método del segundo argumento ( type(self).__mro__ ).

Al decirle a super() que comience a mirar más allá de A , efectivamente le dijo a super() que comience la búsqueda demasiado lejos en el MRO. object siguiente es el object y ese tipo no tiene un atributo q :

 >>> B.__mro__ (, , ) 

Tu código real tiene exactamente el mismo problema :

 class Dirchanger(D): def __init__(self,client,*args): if len(args) == 1: self.cd(args[0]) def cd(self,directory): super(D, self).cd(directory) 

Estás iniciando la búsqueda de MRO en D , no Dirchanger aquí.