我该在类中哪里导入urllib2?
我有一个类需要使用urllib2,举个简单的例子:
class foo(object):
myStringHTML = urllib2.urlopen("http://www.google.com").read()
我应该怎么组织我的代码来包含urllib2呢?一般来说,我想把foo放在一个工具模块里,里面还有其他一些类,并且希望能单独从这个模块中导入foo:
from utilpackage import foo
把导入放在类里面是正确的做法吗?这让我觉得有点奇怪,但确实能用....
class import_u2_in_foo(object):
import urllib2
myStringHtml = urllib2.urlopen("http://www.google.com").read()
还是说我应该把foo移到另一个包里,这样我就总是能使用
import foo
# then foo.py contains
import urllib2
class foo(object):
myStringHtml = urllib2.urlopen("http://www.google.com").read()
在这里我应该怎么组织我的代码才能最符合Python的风格呢?
3 个回答
在Python中,class
和import
都是很普通的指令,没有什么特别的魔法(虽然在背后确实有一些事情在发生,但它们依然是简单的Python指令)。
Python会从上到下逐行读取你的代码,执行每一条指令——无论是class
指令用来创建一个新类的对象,还是import
指令用来把新的模块引入到当前的作用域中。
而且,因为import
指令和其他指令一样好用,你可以把它放在class
里面——你可以把类想象成目录中的.py文件,通常你会习惯于在.py文件的主作用域中直接放import
。
写到这里,我不太明白你想通过把这个放到你的类里达到什么效果:
myStringHtml = urllib2.urlopen("http://www.google.com").read()
——这个指令在类创建时被解析,然后这个类的所有对象都会共享同一个myStringHtml值。
关于把import urllib2
放在哪里的问题,我也不太理解具体的困惑,但对我来说,最自然的做法是这样:
import foo
# then foo.py contains
import urllib2
class foo(object):
myStringHtml = urllib2.urlopen("http://www.google.com").read()
我一般的做法是,如果一个导入的东西在文件里被很多地方用到,我就把它放在最上面。如果它只被一个函数或者一个小范围用到,我就把它放得离使用的地方近一点,比如放在类或者函数里。
不过,这并不是一个绝对的规则,我通常也不会花太多时间去考虑导入放在哪里最好。大多数情况下,我还是把它们放在最上面。
我喜欢把导入放在离使用地方近的两个主要原因是:
如果一个函数导入了它需要的东西,那么我可以很方便地把这段代码剪切粘贴到另一个文件里,比如为了测试,或者如果是一些模板代码,比如“捕捉并记录这个代码中发生的任何异常”的代码。
如果一个函数不常用,或者需要一个不常安装的模块,我就不需要在不使用的时候去导入它,也不需要让用户安装他们不需要的模块。
你应该在 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
在我看来,这样做是从导入中最好的实践。