为什么python的BaseHTTPServer是一个老式的类?


python

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

旨在向后兼容,因此此类差异阻止了 Python2 将标准库中的经典类更改为新样式。

相关内容

最新更新