的BaseHTTPServer.HTTPServer
是旧式类有什么原因吗?
>>> import BaseHTTPServer
>>> type(BaseHTTPServer.HTTPServer)
classobj
我问是因为我想在继承自HTTPServer
的类中使用super
,但不能。 有一个解决方法:
class MyHTTPServer(HTTPServer,object):
...
此解决方法是否有任何隐藏的"陷阱"?
根据Steve Holden的说法,
... it was easier to leave them as they were than risk
introducing incompatibilities.
这个问题在 Python3 中得到了纠正,其中所有类都是新式类。
如今,我们
只看到新式类的优势,我们习惯于以与新式兼容的方式进行编程。但是,当经典类成为常态时,可能会有这样的代码:
def __str__():
return "I'm Classic"
class Classic: pass
c = Classic()
c.__str__ = __str__
print(c)
哪些打印
I'm Classic
但是,如果将经典类更改为新样式,那么在实例上定义特殊方法的这种方法将被破坏:
class New(object): pass
n = New()
n.__str__ = __str__
print(n)
指纹
<__main__.New object at 0xb746ad4c>
对于新样式类,必须在对象的类(或 MRO)中定义特殊方法(如 __str__
),以便它影响对象。旧式类的情况并非如此。
旨在向后兼容,因此此类差异阻止了 Python2 将标准库中的经典类更改为新样式。