Python - 继承旧式类

Ben*_*son 31 python inheritance telnet

我试图通过telnet连接到实验室仪器.我想Telnettelnetlib标准库中的模块扩展类,以包含特定于我们仪器的函数:

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

我在这段代码中尝试做的就是__init__从父类(telnetlib.Telnet)继承方法并传递标准参数,所以我可以在__init__以后添加内容.这个公式在其他场合对我有用; 这次它super()在我尝试实例化时在语句中给出了一个错误:

TypeError: must be type, not classobj
Run Code Online (Sandbox Code Playgroud)

我查看了telnetlib的源代码,Telnet似乎是一个旧式类(它不会继承object) - 我想知道这是否可能是我的问题的根源?如果是这样,怎么可以克服?我已经看到了一些代码示例,其中派生类从超类继承object,虽然我不完全确定这是否是对我的同一问题的响应.

披露:我一直在使用也尝试telnetlib.Telnet代替super(),并from telnetlib import TelnetTelnet到位的super().在这些情况下问题仍然存在.

谢谢!

Thi*_*ter 43

你需要像这样调用构造函数:

telnetlib.Telnet.__init__(self, host, port, timeout)
Run Code Online (Sandbox Code Playgroud)

您需要添加显式,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)
Run Code Online (Sandbox Code Playgroud)


Mar*_*cin 14

你必须继承object,你必须把它放在你试图继承的旧式类之后(所以object首先找不到方法):

>>> 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>
Run Code Online (Sandbox Code Playgroud)

继承自object为您提供了一个可以使用的新式类super.

  • 以一种基于它的方式创建新式类的方式从旧式类继承是否安全? (2认同)