multiple method init__ herency comando python inheritance superclass super

method - El comportamiento de Python super() no es confiable



super class self__ init__ python (5)

¿Está recargando módulos de alguna manera en el medio de las cosas? Si es así, eso puede explicar este error.

isinstance(self,DBAdminConnection) puede volverse falso después de volver a cargar los módulos debido a los cambios en las referencias de memoria, aparentemente.

Editar: si está ejecutando su aplicación web.py en mod_wsgi, asegúrese de que está deshabilitando la recarga automática:

app = web.application(urls, globals(), autoreload=False)

Por alguna razón, el método super() no siempre se comporta como se esperaba, y opta por regresar:

TypeError(''super(type, obj): obj must be an instance or subtype of type)''

Entiendo lo que significa el error. No entiendo por qué aparece como un error. Aquí está el fragmento de código que se está rompiendo. Todos los objetos en el sistema son nuevos objetos de estilo.

Lo realmente interesante es que este error no siempre aparece. No sé lo que lo está causando. El método super() en Retrieval está pasando la clase Retrieval , y luego él mismo como un objeto, que, hasta donde yo sé, exactamente cómo se supone que se invoque super() .

¿Alguna idea?

En el archivo DBConnection.py :

class DBAdminConnection(object): def __init__(self): self.user = DBUserConnection().user self.submissions = DBSubmissionConnection()

En el archivo Retrieval.py

class Retrieval(DBConnection.DBAdminConnection): def __init__(self, username=None, password=None, unique_key=None): super(Retrieval,self).__init__() if username and password: self.username = username self.user.login(username,password, config.DATABASE) if self.user.error: raise UserLoginError(username) self.unique_key = unique_key


No estoy seguro de por qué está ocurriendo el error, pero como ayuda para la depuración, puede envolver la llamada a super en un bloque try/except y realizar un volcado de datos cuando se produce la excepción. Algo como esto:

class Retrieval(DBConnection.DBAdminConnection): def __init__(self, username=None, password=None, unique_key=None): try: super(Retrieval,self).__init__() except TypeError, e: print "Failure initialising Retrieval --> self: %r" raise if username and password: self.username = username self.user.login(username,password, config.DATABASE) if self.user.error: raise UserLoginError(username) self.unique_key = unique_key


Si está utilizando reload () como parte de su flujo de trabajo, aparentemente también necesita usar super(self.__class__, self).__init__ para la inicialización de la herencia.

Sospecho que encontrarás que este error coincide con id(self.__class__) ==id(Retrieval) .


Solo tuve el mismo problema, ejecutando mi código en el bloc de notas jupyter. Estaba usando la recarga, así que reinicié mi kernel para seguir la respuesta de Eduardo Ivanec y ver si este era el problema. Entonces mi código se rompió. Descubrí que mi problema estaba relacionado con varias capas de herencia, donde la capa inferior se definió por encima de la segunda capa inferior en el módulo.

class MyClass1(object): ''''''example class 1'''''' class MyClass2(MyClass1): ''''''example class 2'''''' def __init__(self): super(MyClass2, self).__init__() class MyClass4(MyClass3): ''''''example class 4 - no __init__ definition'''''' class MyClass3(MyClass2): ''''''example class 3 - no __init__ definition''''''

Cuando moví MyClass4 debajo de MyClass3, solucionó el problema.

Este es probablemente un error de novato, por lo que probablemente no resolverá la causa del problema original anterior, pero pensé que lo publicaría en caso de que haya otros novatos, como yo, que están cometiendo el mismo error.

(Disculpas si mi estilo es incorrecto, esta es mi primera publicación en . :))


Tuve el mismo error, entonces noté que tenía una clase duplicada (mi error) dentro del mismo archivo.py. El error desapareció cuando cambié el nombre de la segunda clase A a clase B

#Just some example below, not real code class A (object): def fun(self): super(A, self).fun() class A (object): ##This second class with same name (A) caused the error def some_fun(self,x,y):