質問

この午後を過ごした数時間している既存のものを探し出しグマカスタムへの拡張 urllib2.Request.この問題は、その利用 super(ExtendedRequest, self), て urllib2.Request (私はPython2.5)も古いスタイルクラスの使用 super() はできません。

目の前にある、ことりと触れ合う新しいクラスの両方の特徴

class ExtendedRequest(object, urllib2.Request):
    def __init__():
        super(ExtendedRequest, self).__init__(...)

の方法でやらねばならない。を呼び出していることを、私は残 AttributeError: type 上げにより urllib2.Request.__getattr__().現在は、開始およびコピーアンドペーストの全体 urllib2.Request クラスからの/usr/bin/pythonで書き換えとして

class Request(object):

では、どういうことによりエレガント。( この れて 新スタイル クラスに基づく urllib2.Request 職支援 super().)

編集: による方法:のAttributeErrorについて

>>> class ExtendedRequest(object, urllib2.Request):
...   def __init__(self):
...     super(ExtendedRequest, self).__init__('http://stackoverflow.com')
...
>>> ABC = ExtendedRequest ()
>>> d = urllib2.urlopen(ABC)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/urllib2.py", line 124, in urlopen
    return _opener.open(url, data)
  File "/usr/lib/python2.5/urllib2.py", line 373, in open
    protocol = req.get_type()
  File "/usr/lib/python2.5/urllib2.py", line 241, in get_type
    if self.type is None:
  File "/usr/lib/python2.5/urllib2.py", line 218, in __getattr__
    raise AttributeError, attr
AttributeError: type
役に立ちましたか?

解決

階層がシンプルであるため、これは正常に動作する必要があります。

class ExtendedRequest(urllib2.Request):
    def __init__(self,...):
        urllib2.Request.__init__(self,...)

他のヒント

使用することを通じて達成され、最高です。多くの困難を用いた超になっている。Readジェームズ-ナイト"の http://fuhm.org/super-harmful/ 用例です。

このリンクを示し(その他の課題)

  1. スーパークラスを使用しなスーパーの場合そのサブクラスではな
  2. __init__ 署名のサブクラスを使用するスーパーが一致している必要があります。に合格しなければなりませんすべての引数を受け、スーパー機能。ご __init__ を行うことができるように電話その他のクラスの __init__ 方法は上位の階層となります。
  3. な利用の位置引数 __init__

お状では、上記の各criteraに違反した場合.

ジェームズ-ナイト"でも言うように、

の状況にあるスーパー() することができあがき てダイヤモンドの継承関係を示します。も そして、することができるのではないとしてお役に立てると、 いた。

の条件下にあるスーパーが使用でき正しく十分に有償、その思い超有用性を理解しにくくなるからです。好みの組成デザインパターン以上の場合は、サブクラス.を避けるダイヤモンドの継承ができます。の場合を制御するオブジェクト階層からトップオブジェクト)の下、一貫してスーパーでは、大丈夫です。からだ全体をコントロークラス階層この場合にはめることをお勧めしたい捨ての使用 super.

私はあなたのサンプル中のの初期化のの定義に自己パラメータを渡すために逃したと思います。 この方法を試してください。

class ExtendedRequest(object, urllib2.Request):
    def __init__(self):
        super(ExtendedRequest, self).__init__(self)

私はそれをテストし、オーケーに動作するようです。

>>> x = ExtendedRequest()
>>> super(ExtendedRequest, x)
<super: <class 'ExtendedRequest'>, <ExtendedRequest object>>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top