我使用的是python3.3,在Windows上进行测试。我不明白什么。为什么我这么做:
>>> import urllib
我弄错了
^{pr2}$以及
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__initializing__',
'__loader__', '__name__', '__package__', '__path__']
没有请求,所以看起来很可靠。但是,导入子模块请求时:
>>> import urllib.request
似乎有用
>>> urllib.request
<module 'urllib.request' from 'C:\\Python33\\lib\\urllib\\request.py'>
现在自动dir(urllib)
显示:
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__initializing__',
'__loader__', '__name__', '__package__', '__path__', 'error', 'parse',
'request', 'response']
为什么我看不到import urllib
所有子模块之后?根据http://docs.python.org/3.3/library/urllib.html#urllib.urlopen,它应该是request
,error
,parse
,parserobots
。其他操作系统有什么不同吗?在
当你在的时候
您真正要做的是查找在
package/__init__.py
中定义的名称something
。所以,如果有人明确地把名字写在那里,你就可以使用它。否则你不能以Python
^{pr2}$web.py
库为例(github)。你可以的之所以在这里,是因为在
web/__init__.py
中有一个显式的import httpserver
或类似的语句。在实际上这不是python3的问题。在Python3中遇到它是因为它使用标准库的包,而不仅仅是像Python2这样的普通模块。由于某些原因,
urllib/__init__.py
是currently empty,所以您需要显式地import
精确的模块,比如request
来使用它们。对于一些标准包python3import
对应的__init__.py
文件中的一些“子模块”。也许只是为了向后兼容。在另一个问题是为什么在},因为
import urllib.request
之后,dir(urllib)
会显示其他模块,比如response
。看起来urllib.request
内部使用的同一个包中的所有模块在import
之后都将可用。如果你只是import urllib.error
你就得不到{error
没有使用它。如果您检查Python导入系统的源代码,所有这些都会变得更容易理解—它充满了副作用(例如,使用globalsys.modules
字典“缓存”导入的模块)。在urllib
是一个包。导入包不会自动导入包中包含的模块;您需要显式导入urllib.request
模块。在让我们看看^{} 。{it在模块中定义为的模块名。
request
未在urllib
s__init__
中定义,因此不会列出它。在现在,对于“包如何工作”来说,包是某种基于目录的模块。它是从其
__init__.py
加载的,但允许子模块和子包(与__init__
位于同一目录中的文件和目录)。{g{2>当你把所有的文件都加载到cd4}和它的类的初始值时,你就把它看作是与类的比较非常好——当您创建对象时,只调用它的
__init__
,方法,而不是它的所有属性(方法也是属性)。此外,属性可以是函数或字段。字段也可以有属性。澄清:__init__.py
用于包,而__init__
用于对象子模块对于包的作用与方法(函数属性)对于对象的意义一样
子包对于包就像字段(非函数属性)对于对象一样。
为什么?
__init__
负责设置对象,子模块/方法是在一个地方存储逻辑的方法,子包/字段是组织其他子模块/方法或子子包/字段的方法。在坦率地说:在CPython实现中,它的工作方式不是这样的,但是对于理解它的行为,它是一个非常好的模型。在
相关问题 更多 >
编程相关推荐