Python - inheriting from old-style classes
Solution 1
You need to call the constructor like this:
telnetlib.Telnet.__init__(self, host, port, timeout)
You need to add the explicit self
since telnet.Telnet.__init__
is not a bound method but rather an unbound method, i.e. witout an instance assigned. So when calling it you need to pass the instance explicitely.
>>> 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)
Solution 2
You have to inherit from object
, and you must put it after the old-style class you are trying to inherit from (so that object
's methods aren't found first):
>>> 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>
Inheriting from object gives you a new-style class which works with super
.
Benjamin Hodgson
I work here! It takes a lot of self-restraint for me not to abuse my live database privileges to artificially inflate my reputation score. [email protected]
Updated on June 17, 2022Comments
-
Benjamin Hodgson about 2 years
I am trying to connect via telnet to a laboratory instrument. I'd like to extend the
Telnet
class from thetelnetlib
module in the standard library, to include functions specific to our instrument:import telnetlib class Instrument(telnetlib.Telnet): def __init__(self, host=None, port=0, timeout=5): super(Instrument,self).__init__(host, port, timeout)
All I am trying to do in this code is inherit the
__init__
method from the parent class (telnetlib.Telnet
) and pass on the standard arguments, so I can add things to__init__
later. This formula has worked for me on other occasions; this time it gives me an error at thesuper()
statement when I try to instantiate:TypeError: must be type, not classobj
I looked at the source code for telnetlib, and Telnet appears to be an old-style class (it doesn't inherit from
object
) - I'm wondering if this could be the source of my problem? If so, how can it be overcome? I've seen some code examples where the derived class inherits both from the superclass andobject
, though I'm not entirely sure if this is a response to the same problem as me.Full disclosure: I have also tried using
telnetlib.Telnet
in place ofsuper()
, andfrom telnetlib import Telnet
withTelnet
in place ofsuper()
. The problem persists in these cases.Thanks!