-3

你如何确定一个类中有哪些方法可用?

例子 :

我正在尝试了解 urllib.request。我在文档中找到了 urlopen() :

http://docs.python.org/3.0/library/urllib.request.html

所以我有 :

response = urllib.request.urlopen(url)

这会返回什么?我知道它可能是一个对象,但是这个对象的方法是什么?最终,我找到了示例(卡在页面底部,远离引入想法的地方)并发现了 read(),但我不得不在文档之外查找 .decode(),这最终让你可以做这个库的全部目的是。

我在很多 docs.python.org 页面上都遇到了这种类型的问题。其他地方是否有更好的文档,或者我要以错误的方式学习这些?

4

4 回答 4

5

这里真正的问题是您使用的是非常旧版本的文档。我不知道你是如何找到它的,但从 URL http://docs.python.org/3.0/library/urllib.request.html和该页面顶部的标题(“Python v3.0.1 文档”),等等,您没有查看您的版本的文档。*

如果您正在查看3.3 文档,您会看到:

对于 http 和 https url,此函数返回一个http.client.HTTPResponse对象,该对象具有以下HTTPResponse 对象方法。

第一个链接将您带到确切类的引用,第二个链接将您带到抽象类型的引用。它为您提供了您正在寻找的东西——read方法,以及其他一切。


在旧版本的 Python 中,术语“类文件对象”被随意地抛出。这总是一个模糊的术语(有时它的意思是“一个可迭代的行”、“有一个read()和/或write()适当的”、“有一个fileno()”、……),在 Python 3 中变得更加如此(因为你必须区分一个来自文本文件的二进制文件)。因此,多年来,他们已经逐步淘汰了这一点,以支持更具体的文档。但是,如果您正在查看最早的 Python 3 文档,您并没有从中受益。


* 请注意,如果您访问任何最新版本的文档,例如上面链接的 3.3,标题中有一个下拉菜单,如果您发现错误的版本,您可以切换到其他版本。而且,默认值始终是 2.7 或最新的稳定版 3.x,这些也是最常见的搜索结果,也是最容易链接的内容,因此您通常会选择其中之一,除非您真的尝试为自己制造困难。如果您确实发现自己在 3.0 或 2.4 之类的古老文档中,您通常可以将 URL 编辑为3.3or 2.7,或者只是3or 2;如果没有,快速搜索应该可以。

于 2013-09-06T22:02:47.330 回答
4

文档中的关键短语urlopen是:

此函数返回一个类文件对象,其中包含来自 urllib.response 模块的两个附加方法

这是一个类文件对象这一事实表明所有正常的文件操作函数(read, close)也适用于返回的对象。

于 2013-09-06T21:47:21.197 回答
4

您链接到的文件是这样说的:

此函数返回一个类文件对象,其中包含来自 urllib.response 模块的两个附加方法

geturl() — return the URL of the resource retrieved, commonly used to determine if a redirect was followed
info() — return the meta-information of the page, such as headers, in the form of an http.client.HTTPMessage instance (see Quick Reference to HTTP Headers)

强调我的。“类文件对象”定义如下

文件对象

向底层资源公开面向文件的 API(使用 read() 或 write() 等方法)的对象。根据创建的方式,文件对象可以调解对真实磁盘文件或其他类型的存储或通信设备(例如标准输入/输出、内存缓冲区、套接字、管道等)的访问。 . 文件对象也称为类文件对象或流。


正如@abarnert 指出的那样,您最好使用新的文档,它明确链接到返回对象的方法

于 2013-09-06T21:47:26.510 回答
3

如果您还没有使用Ipython,那么您应该使用。然后你可以输入 urllib。并按 Tab 查看所有可用选项,并对返回的任何内容执行相同操作。如果你在函数后面输入一个问号,它会调出文档,两个问号通常会调出源代码。

尽管我一直发现在线文档非常有帮助,但它的价值是什么。它确实说 urllib.request.urlopen 将在解释的早期返回一个类似对象的文件

于 2013-09-06T21:47:09.643 回答