pyplot - Python: hereda de las clases antiguas
title plt python (2)
Debes llamar al constructor así:
telnetlib.Telnet.__init__(self, host, port, timeout)
Necesita agregar el self
explícito desde telnet.Telnet.__init__
no es un método vinculado sino un método independiente , es decir, sin una instancia asignada. 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)
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 padre ( telnetlib.Telnet
) y transmitir los argumentos estándar, así puedo agregar cosas a __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 instanciar:
TypeError: must be type, not classobj
Miré el código fuente para telnetlib, y Telnet parece ser una clase de estilo antiguo (no hereda del 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 del todo seguro de si esto es una respuesta al mismo problema que yo.
telnetlib.Telnet
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!
Tienes que heredar de un object
, y debes ponerlo después de la clase de estilo antiguo de la que intentas 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 estilo nuevo que funciona con super
.