今天下午我花了几个小时试图找到一个错误,在我的定义扩展到 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/lib/蟒蛇只是重写作

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,...)

其他提示

使用超级可能不总是最佳的做法。有许多困难与使用超级。詹姆斯读的骑士 http://fuhm.org/super-harmful/ 例子。

链接表示了(除其他问题),

  1. 超类必须使用超如果他们的子类做
  2. __init__ 签名的所有亚类,即使用超级应相匹配。你必须通过所有论点你接收到的超级功能。你的 __init__ 必须准备好通话的任何其他类的 __init__ 方法的层次。
  3. 从来没有利用位置的论点 __init__

在你的情况下,上述每一标准被违反。

詹姆斯*奈特还说,

唯一的情况超级() 实际上可能有帮助的是当你 有钻石继承。甚至 然后,常常不作有帮助 你可能会有想法。

在哪些条件下的超级可以使用正确地充分繁重,我认为超级的有用性是相当有限。喜欢的组合物的设计图案子类化。避免钻石继承权,如果可以的话。如果你控制的目的层次结构从上(object)到底,使用超级一致,那么你是好的。但是,由于你不能控制的整个班级层次,在这种情况下,我建议你放弃使用 super.

我想你错过了自我参数传递给定义的的init 您的样本。 尝试这一个:

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