Python – heredar de las clases de estilo antiguo

Estoy tratando de conectarme a través de telnet a un instrumento de laboratorio. Me gustaría extender la clase Telnet desde el módulo telnetlib en la biblioteca estándar, para incluir funciones específicas de nuestro instrumento:

 import telnetlib class Instrument(telnetlib.Telnet): def __init__(self, host=None, port=0, timeout=5): super(Instrument,self).__init__(host, port, timeout) 

Todo lo que trato de hacer en este código es heredar el método __init__ de la clase principal ( telnetlib.Telnet ) y pasar los argumentos estándar, por lo que puedo agregar cosas a __init__ más adelante. Esta fórmula me ha funcionado en otras ocasiones; esta vez me da un error en la instrucción super() cuando bash crear una instancia:

 TypeError: must be type, not classobj 

Miré el código fuente de telnetlib, y Telnet parece ser una clase de estilo antiguo (no se hereda de un object ). Me pregunto si esta podría ser la fuente de mi problema. Si es así, ¿cómo se puede superar? He visto algunos ejemplos de código donde la clase derivada hereda tanto de la superclase como del object , aunque no estoy completamente seguro de que esto sea una respuesta al mismo problema que yo.

Revelación completa: también he intentado usar telnetlib.Telnet en lugar de super() , y from telnetlib import Telnet con Telnet en lugar de super() . El problema persiste en estos casos.

¡Gracias!

Necesitas llamar al constructor así:

 telnetlib.Telnet.__init__(self, host, port, timeout) 

telnet.Telnet.__init__ agregar el self explícito ya que telnet.Telnet.__init__ no es un método vinculado sino un método independiente , es decir, sin una instancia asignada. Entonces cuando lo llames necesitas pasar la instancia explícitamente.

 >>> Test.__init__  >>> Test().__init__ > >>> Test.__init__() Traceback (most recent call last): File "", line 1, in  TypeError: unbound method __init__() must be called with Test instance as first argument (got nothing instead) 

Debe heredar de un object y debe colocarlo después de la clase de estilo antiguo que intenta heredar (para que los métodos del object no se encuentren primero):

 >>> class Instrument(telnetlib.Telnet,object): ... def __init__(self, host=None, port=0, timeout=5): ... super(Instrument,self).__init__(host, port, timeout) ... >>> Instrument() <__main__.Instrument object at 0x0000000001FECA90> 

Heredar de un objeto te da una clase de nuevo estilo que funciona con super .