web-dev-qa-db-ja.com

Python-古いスタイルのクラスから継承

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_を使用してみました。これらの場合でも問題は解決しません。

ありがとう!

32

コンストラクタ を次のように呼び出す必要があります。

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)
42
ThiefMaster

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で機能する新しいスタイルのクラスが得られます。

14
Marcin