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 TelnetTelnet代わりにを使用してみました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のメソッドが最初に見つかりません)。

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

object から継承すると、 で動作する新しいスタイルのクラスが得られますsuper

于 2012-07-17T17:57:05.697 に答える