作りスーパー()の仕事はPythonのurllib2.要求
-
20-09-2019 - |
質問
この午後を過ごした数時間している既存のものを探し出しグマカスタムへの拡張 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/ 用例です。
このリンクを示し(その他の課題)
- スーパークラスを使用しなスーパーの場合そのサブクラスではな
- の
__init__
署名のサブクラスを使用するスーパーが一致している必要があります。に合格しなければなりませんすべての引数を受け、スーパー機能。ご__init__
を行うことができるように電話その他のクラスの__init__
方法は上位の階層となります。 - な利用の位置引数
__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>>