2012-07-17 30 views
26

Estoy intentando conectarme a través de telnet a un instrumento de laboratorio. Me gustaría extender la clase del módulo Telnettelnetlib en la biblioteca estándar, para incluir funciones específicas a nuestro instrumento:Python: herencia de las clases antiguas

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 estoy tratando de hacer en este código se heredan el método __init__ de los padres clase (telnetlib.Telnet) y pasar los argumentos estándar, por lo que puedo agregar cosas al __init__ más tarde. Esta fórmula me ha funcionado en otras ocasiones; esta vez me da un error en la declaración super() cuando intento 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 (que no hereda de 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 ambos de la superclase y object, aunque no estoy del todo seguro de si esto es una respuesta al mismo problema que yo.

La 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!

Respuesta

36

es necesario llamar a la constructor así:

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

es necesario agregar la explícita self desde telnet.Telnet.__init__ no es un método cota sino más bien una método no unido, es decir witout una instancia asignado. Entonces, cuando lo llame, debe pasar la instancia explícitamente.

>>> Test.__init__ 
<unbound method Test.__init__> 
>>> Test().__init__ 
<bound method Test.__init__ of <__main__.Test instance at 0x7fb54c984e18>> 
>>> Test.__init__() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unbound method __init__() must be called with Test instance as first argument (got nothing instead) 
+0

Lo he intentado - me da el error: 'TypeError: método unbound __init __() debe llamarse con la instancia Telnet como primer argumento (instancia get str en cambio)' –

+0

Muestra el código exacto y el error que obtienes el código que acabo de publicar Porque así es como se hace realmente si quieres llamar al constructor padre de una clase antigua. – ThiefMaster

+0

Ah, he visto la diferencia entre tu código y el mío: tuviste 'self' como el primer argumento de' __init__'. Funciona ahora, ¡gracias por responder tan rápido! ¿Podrías explicarme por qué necesitas dar 'self' como primer argumento al constructor? Soy nuevo en Python. –

13

Usted tiene que heredar de object, y debe ponerlo después de la clase de estilo antiguo que está tratando de heredar de (por lo que los métodos object 's no se encuentran en primer lugar):

>>> 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 objeto le da una clase de nuevo estilo que funciona con super.

+2

¿Es seguro heredar de una clase antigua de una manera que crea una nueva clase de estilo basada en ella? – ThiefMaster

+0

@ThiefMaster No conozco ningún problema, pero nunca lo hice con enojo, así que realmente no tengo información. ¿Anticipa algún problema? – Marcin

+0

No estoy familiarizado con la herencia múltiple en Python. Dado que una clase de estilo nuevo no confiere ninguna ventaja para mi propósito, voy a seguir con la estrategia de TheifMaster anterior. ¡Gracias de todos modos! –

Cuestiones relacionadas