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

时间:2014-02-08 10:36:17

标签: python python-2.x httpserver

有没有理由python的BaseHTTPServer.HTTPServer是旧式的?

>>> import BaseHTTPServer
>>> type(BaseHTTPServer.HTTPServer)
classobj

我问,因为我想在继承自super但不能继承的类中使用HTTPServer。有一种解决方法:

class MyHTTPServer(HTTPServer,object):
    ...

这种解决方法是否有任何隐藏的'陷阱'?

1 个答案:

答案 0 :(得分:4)

According to 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将标准库中的经典类更改为新样式。