Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-从旧式类继承_Python_Inheritance_Telnet - Fatal编程技术网

Python-从旧式类继承

Python-从旧式类继承,python,inheritance,telnet,Python,Inheritance,Telnet,我正在尝试通过telnet连接到实验室仪器。我想从标准库中的telnetlib模块扩展Telnet类,以包括特定于我们仪器的功能: import telnetlib class Instrument(telnetlib.Telnet): def __init__(self, host=None, port=0, timeout=5): super(Instrument,self).__init__(host, port, timeout) 在这段代码中,我所要做的就是从

我正在尝试通过telnet连接到实验室仪器。我想从标准库中的
telnetlib
模块扩展
Telnet
类,以包括特定于我们仪器的功能:

import telnetlib
class Instrument(telnetlib.Telnet):
    def __init__(self, host=None, port=0, timeout=5):
        super(Instrument,self).__init__(host, port, timeout)
在这段代码中,我所要做的就是从父类(
telnetlib.Telnet
)继承
\uuuuu init\uuuu
方法,并传递标准参数,以便以后可以向
\uuu init\uu
添加内容。这个公式在其他场合也适用于我;这一次,当我尝试实例化时,
super()
语句中出现了一个错误:

TypeError: must be type, not classobj
我查看了telnetlib的源代码,Telnet似乎是一个旧式的类(它不是从
对象
继承的)-我想知道这是否是我的问题的根源?如果是,如何克服?我见过一些代码示例,其中派生类同时继承了超类和
对象
,尽管我不完全确定这是否是对与我相同问题的响应

充分披露:我还尝试使用
telnetlib.Telnet
代替
super()
,并从telnetlib导入
Telnet
,用
Telnet
代替
super()
。在这些情况下,问题依然存在

谢谢

您需要像这样调用:

telnetlib.Telnet.__init__(self, host, port, timeout)
您需要添加显式的
self
,因为
telnet.telnet.\uuu init\uuu
不是绑定方法,而是未绑定方法,即不指定实例。因此,在调用它时,需要显式地传递实例

>>> 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)
>>测试__
>>>Test()。\uuu init__
>>>测试
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:必须以测试实例作为第一个参数调用未绑定的方法_uinit__;()

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

类工具(telnetlib.Telnet,对象): ... def u u init _;(self,host=None,port=0,timeout=5): ... 超级(仪器,自身)。\uuuu初始化\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu ... >>>文书(

从object继承为您提供了一个新样式的类,它可以与
super

一起工作,我已经尝试过了-它给了我一个错误:
TypeError:unbound method.\uuuu init\uuuuuuuuuuu()必须以Telnet实例作为第一个参数来调用(改为get str instance)
请显示我刚刚发布的代码的确切代码和错误。因为如果你想调用一个老式类的父构造函数,实际上就是这样做的。啊,我已经发现了你的代码和我的代码之间的区别——你把
self
作为
\uuu init\uu
的第一个参数。现在可以了-谢谢你这么快回复!你能给我解释一下为什么你需要把
self
作为构造函数的第一个参数吗?我是Python新手。请注意,这仍然会给您一个旧式的类。您始终需要将self传递给任何方法(类和静态方法除外)。这在正常的点调用中是半自动处理的:您调用
self.foo(a,b)
,Python将其转换为对
foo(self,a,b)
的调用。但在本例中,您不是在对象上调用
\uuuu init\uuuu
,而是在类上调用它,这意味着您必须显式地添加
self
。(这在一些细节上有点不准确,但对于学习来说已经足够接近了。)从一个旧样式的类继承一个基于它创建新样式的类是否安全?@ThiefMaster我不知道有什么问题,但我从来没有生气过,所以我真的没有任何信息。你预计会有什么问题吗?我不熟悉Python中的多重继承。既然一个新型的课程对我来说没有任何好处,我将坚持上面的老师的策略。不过还是要谢谢你@poorsod您认为python中的“多重继承”有什么特别之处?新样式类的一个主要优点是,它们实际上正确地处理多重继承。@poorsod
super
+新样式类的目的是使这项工作可以预测。答案是,您将通过搜索
\uuuumro\uuuuu
获得第一个
\uuuuu init\uuuu
>>> 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>