超级()工作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/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/ 例子。
链接表示了(除其他问题),
- 超类必须使用超如果他们的子类做
- 的
__init__
签名的所有亚类,即使用超级应相匹配。你必须通过所有论点你接收到的超级功能。你的__init__
必须准备好通话的任何其他类的__init__
方法的层次。 - 从来没有利用位置的论点
__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>>