我正在尝试通过telnet连接到实验室仪器。我想从标准库中的Telnet
模块扩展telnetlib
类,以包含特定于我们工具的函数:
import telnetlib
class Instrument(telnetlib.Telnet):
def __init__(self, host=None, port=0, timeout=5):
super(Instrument,self).__init__(host, port, timeout)
我在这段代码中尝试做的只是从父类(__init__
)继承telnetlib.Telnet
方法并传递标准参数,因此我可以向__init__
添加内容后来。这个公式在其他场合对我有用;这次当我尝试实例化时,它在super()
语句中给出了一个错误:
TypeError: must be type, not classobj
我查看了telnetlib的源代码,Telnet似乎是一个旧式类(它不是从object
继承) - 我想知道这是否可能是我的问题的根源?如果是这样,怎么可以克服?我已经看到了一些代码示例,其中派生类继承了超类和object
,但我不完全确定这是否是对我的同一问题的响应。
完全披露:我还尝试使用telnetlib.Telnet
代替super()
,from telnetlib import Telnet
代替Telnet
代替super()
。在这些情况下问题仍然存在。
谢谢!
答案 0 :(得分:42)
你需要像这样调用constructor:
telnetlib.Telnet.__init__(self, host, port, timeout)
您需要添加显式self
,因为telnet.Telnet.__init__
不是绑定方法,而是未绑定方法,即无法分配实例。因此,在调用它时,您需要明确地传递实例。
>>> 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)
答案 1 :(得分:14)
您必须从object
继承,并且必须将其放在您尝试继承的旧式类之后(以便首先找不到object
的方法):< / p>
>>> 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>
从object继承为您提供了一个与super
一起使用的新式类。