32

我正在尝试通过 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 TelnetwithTelnet代替super(). 在这些情况下问题仍然存在。

谢谢!

4

2 回答 2

44

您需要像这样调用构造函数

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)
于 2012-07-17T17:44:15.860 回答
16

您必须继承自object,并且必须将其放在您尝试继承的旧式类之后(这样object就不会首先找到 's 方法):

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

从对象继承为您提供了一个与super.

于 2012-07-17T17:57:05.697 回答