文档章节

Python new-style class explanation.

shawnplaying
 shawnplaying
发布于 2017/04/20 16:07
字数 295
阅读 9
收藏 0

问题来源:想写一个非常简单的HTTP服务器,所以写了如下类:

import BaseHTTPServer
import SimpleHTTPServer

class MyHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    
    def do_GET(self):
        super(MyHTTPRequestHandler, self).do_GET()

def run_http_server():
    print('start http server')
    httpd = BaseHTTPServer.HTTPServer(('', 8000), MyHTTPRequestHandler)
    sa = httpd.socket.getsockname()
    print('Serving HTTP on %s port: %s'%(sa[0], sa[1]))
    httpd.serve_forever()

if __name__ == '__main__':
    run_http_server()

结果运行报错:

Exception happened during processing of request from ('127.0.0.1', 52031)
Traceback (most recent call last):
  File "D:\app\Python27\lib\SocketServer.py", line 295, in _handle_request_noblock
    self.process_request(request, client_address)
  File "D:\app\Python27\lib\SocketServer.py", line 321, in process_request
    self.finish_request(request, client_address)
  File "D:\app\Python27\lib\SocketServer.py", line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "D:\app\Python27\lib\SocketServer.py", line 651, in __init__
    self.handle()
  File "D:\app\Python27\lib\BaseHTTPServer.py", line 340, in handle
    self.handle_one_request()
  File "D:\app\Python27\lib\BaseHTTPServer.py", line 328, in handle_one_request
    method()
  File "hs.py", line 10, in do_GET
    super(MyHTTPRequestHandler, self).do_GET()
TypeError: must be type, not classobj

问题就在于这里的 TypeError: must be type, not classobj 。

做一个例子来解释一下:

>>> class A(object):
...     def test(self):
...             print 'A.test'
...
>>> class B(A):
...     def test(self):
...             super(B,self).test()
...             print 'B.test'
...
>>> b=B()
>>> b.test()
A.test
B.test
>>> type(A)
<type 'type'>
>>> type(B)
<type 'type'>
>>> type(SimpleHTTPServer.SimpleHTTPRequestHandler)
<type 'classobj'>

这就解释了原因。

>>> isinstance(A, type)
True
>>> isinstance(A(), type)
False
>>> isinstance(B, type)
True
>>> isinstance(B(), type)
False
>>> isinstance(A, object)
True
>>> isinstance(A(), object)
True
>>> isinstance(B, object)
True
>>> isinstance(B(), object)
True

>>> isinstance(SimpleHTTPServer.SimpleHTTPRequestHandler,object)
True
>>>
>>> isinstance(SimpleHTTPServer.SimpleHTTPRequestHandler, type)
False
>>> issubclass(A,object)
True
>>> issubclass(SimpleHTTPServer.SimpleHTTPRequestHandler, object)
False

 

© 著作权归作者所有

shawnplaying
粉丝 15
博文 128
码字总数 70642
作品 0
海淀
系统管理员
私信 提问
Python的51个“秘密”被曝光,GitHub获2万星

Python,是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。 但有的时候,Python一些特性导致的输出结果,对于初学者就很难理解了。 一个解析51项堪称是“秘密”的...

急速奔跑中的蜗牛
06/23
0
0
利用python操作小程序云数据库实现简单的增删改查

不止python,你可以利用任何语言那实现通过http请求来操作你自己的小程序云数据库了 背景 也是在最近吧,小程序更新了云开发 HTTP API 文档,提供了小程序外访问云开发资源的能力,使用 HTTP...

急速奔跑中的蜗牛
06/06
0
0
使用Python编写批量添加图片水印程序

文章目录 一、为什么要为图片添加水印 二、利用Python为图片添加水印 三、利用QT for Python制作图片水印添加程序 一、为什么要为图片添加水印 在互联网写文章最头疼的一件事情就是发表的文章...

急速奔跑中的蜗牛
06/23
0
0
为什么Python 3.6以后字典有序并且效率更高?

在Python 3.5(含)以前,字典是不能保证顺序的,键值对A先插入字典,键值对B后插入字典,但是当你打印字典的Keys列表时,你会发现B可能在A的前面。 但是从Python 3.6开始,字典是变成有顺序...

急速奔跑中的蜗牛
07/16
0
0
「转」Serialize and Deserialize complex JSON in Python

COVER :https://medium.com/@yzhong.cs/serialize-and-deserialize-complex-json-in-python-205ecc636caa This post is focused on different ways to interact with JSON with Python usin......

致学无忧
06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
672
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
38
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
25
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
71
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
69
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部