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
の両方を継承するコード例を見てきましたが、これが私と同じ問題への応答であるかどうかは完全にはわかりません。
完全な開示:super()
の代わりに_telnetlib.Telnet
_を使用し、super()
の代わりにTelnet
を使用して_from telnetlib import Telnet
_を使用してみました。これらの場合でも問題は解決しません。
ありがとう!
コンストラクタ を次のように呼び出す必要があります。
telnetlib.Telnet.__init__(self, Host, port, timeout)
telnet.Telnet.__init__
はバインドされたメソッドではなくバインドされていないメソッドであるため、明示的なself
を追加する必要があります。つまり、インスタンスが割り当てられていません。したがって、それを呼び出すときは、明示的にインスタンスを渡す必要があります。
>>> 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)
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>
オブジェクトから継承すると、super
で機能する新しいスタイルのクラスが得られます。