2010-02-05 52 views
1

我有需要的urllib2访问类,对我来说简单的例子是:我在哪里可以导入一个类的urllib2?

class foo(object): 
    myStringHTML = urllib2.urlopen("http://www.google.com").read() 

我应该如何构建我的代码包含的urllib2?在一般情况下,我想存储与许多其他类的应用模块foo中,并能够通过本身从模块导入富:

from utilpackage import foo 

是正确的样式把进口类中?这似乎很奇怪,我,但工程....

class import_u2_in_foo(object): 
    import urllib2 
    myStringHtml = urllib2.urlopen("http://www.google.com").read() 

或者我应该将富成另一种包装,所以我总是用

import foo 
# then foo.py contains 
import urllib2 
class foo(object): 
    myStringHtml = urllib2.urlopen("http://www.google.com").read() 

我应该如何在这里构建我的代码是最pythonic :)?

回答

4

你应该从它导入的utilpackage模块中,但只导出类foo

import urllib2 

__all__ = ["foo"] 

class foo(object): 
    myStringHtml = urllib2.urlopen("http://www.google.com").read() 

然后,你可以做

from utilpackage import foo 

但不

from utilpackage import urllib2 

这我认为从进口的最佳做法。

+0

^加上我只会导入'urlopen',如果你不需要更多的包。 – poke 2010-02-05 14:55:40

+0

因此,__all__接受一个列表,雅?然后__all__ = [“foo”,“another_class”,“and_another_class”]如果他们存在就可以了吗? – mcpeterson 2010-02-06 03:30:37

+0

是的,但名字是'__all__'。它定义了可以使用'from mymodule import ...'语句导入的内容。当你从'utilpackage import *'执行时,只有'__all__'列表中的内容会被导入到你的名字空间。更多细节在这里:http://docs.python.org/tutorial/modules.html – AndiDog 2010-02-06 08:58:42

0

classimport都是正常的Python指令,没有附加任何魔法(好吧,有些事情发生在引擎盖下,但它们仍然只是简单的Python指令)。

Python从上到下执行您的源代码,执行它的每条指令 - 无论是为指令创建新对象的指令,还是用于将新模块导入当前作用域的指令import

此外,由于import指令一样好指令的任何其他,你可以把它里面class - 你可以想想类似的方法类作为你想想.py文件中的目录 - 而在后一种情况下,你”大概习惯了那个import可以直接放在.py文件的主要范围。

写了这么多,我不知道你想加入到这个类实现的目标:

myStringHtml = urllib2.urlopen("http://www.google.com").read() 

- 该指令被解析的类的创建,然后类的所有对象正在共享相同的myStringHtml值。

就问题有关最佳的地方,把进口的urllib2,我也不太明白的问题,但对我来说似乎是最自然的做了这种方式:

import foo 

    # then foo.py contains 
    import urllib2 

    class foo(object): 
     myStringHtml = urllib2.urlopen("http://www.google.com").read() 
2

我的一般规则大拇指是,如果导入被文件中的许多东西使用,我会把它放在最上面。如果它只被一个单一的函数或一个单一的范围使用,我会把它放在它使用的地方,比如在类或函数中。

但是,这并不是一条硬性规定,我也没有花很多时间考虑通常导入导入的最佳位置。大多数情况下,我把它们放在顶部。

我喜欢有进口接近的地方,我使用他们两个最大的原因是:

  • 如果函数进口它所需要的东西,然后我就可以很容易地剪切和代码出来粘贴到另一个文件,出于测试目的,或者它是样板代码,比如我的“catch和syslog代码中发生的任何异常”代码。

  • 如果一个函数不经常使用,或者需要一个通常不常用的模块用于不常用的部分,我不必在不使用它的时候导入它,或者要求用户安装一个模块,需要。

相关问题