我有这样的事情:
# a.py
import os
class A:
...
# b.py
import a
class B(A):
...
在B类(b.py)中,我希望能够使用在a.py中导入的模块(在本例中为os)。是否可以在Python中实现此行为,还是应该在两个文件中导入模块?
编辑:我并不担心导入时间,我的问题是导入块对文件造成的视觉混乱。我最终在每个控制器(RequestHandler)中都有这样的东西:
from django.utils import simplejson
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.ext import db
这是我想避免的。
答案 0 :(得分:13)
是的,您可以通过转到a.os来使用其他文件中的导入。
然而,pythonic的方法是只导入你需要的精确模块而不用链(它可以导致循环引用)。
导入模块时,代码将被编译并插入名称字典中 - >模块对象。该词典位于sys.modules。
import sys
sys.modules
>>> pprint.pprint(sys.modules)
{'UserDict': <module 'UserDict' from 'C:\python26\lib\UserDict.pyc'>,
'__builtin__': <module '__builtin__' (built-in)>,
'__main__': <module '__main__' (built-in)>,
'_abcoll': <module '_abcoll' from 'C:\python26\lib\_abcoll.pyc'>,
# the rest omitted for brevity
当您尝试再次导入模块时,Python将检查字典以查看它是否已存在。如果是,它将返回已编译的模块对象给您。否则,它将编译代码,并将其插入sys.modules。
由于字典是作为哈希表实现的,因此与创建循环引用的风险相比,此查找非常快且占用的时间可以忽略不计。
编辑:我并不担心导入 时代,我的问题是视觉 进口块放的混乱 在文件上。
如果您只有大约4或5个进口,那就不会太杂乱了。请记住,“明确比隐含更好”。但是,如果它真的困扰你那么多,那就这样做:
<importheaders.py>
from django.utils import simplejson
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.ext import db
<mycontroller.py>
from importheaders import *
答案 1 :(得分:1)
再次导入模块。
在python中导入模块是一个非常轻量级的操作。第一次导入模块时,python将加载模块并在其中执行代码。在任何后续导入中,您只需获得对已导入模块的引用。
如果您愿意,可以自行验证:
# module_a.py
class A(object):
pass
print 'A imported'
# module_b.py
import module_a
class B(object):
pass
print 'B imported'
# at the interactive prompt
>>> import module_a
A imported
>>> import module_a # notice nothing prints out this time
>>> import module_b # notice we get the print from B, but not from A
B imported
>>>
答案 2 :(得分:0)
您应该单独导入它。但是,如果您确实需要转发某些功能,则可以从函数返回模块。只是:
import os
def x:
return os
但它似乎是一个插件功能 - 对象+继承可以更好地解决这个问题。
答案 3 :(得分:0)
听起来你想要使用python packages。看看那些。
答案 4 :(得分:0)
是的。导入模块后,该模块将成为当前模块的属性。
# a.py
class A(object):
...
# b.py
import a
class B(a.A):
...
例如,在Django中,许多软件包只是导入其他模块的内容。类和函数在单独的文件中定义,仅用于分离:
# django/db/models/fields/__init__.py
class Field(object):
...
class TextField(Field):
...
# django/db/models/__init__.py
from django.db.models.fields import *
# mydjangoproject/myapp/models.py
from django.db import models
class MyModel(models.Model):
myfield = models.TextField(...)
....
答案 5 :(得分:0)
首先,您可以将其缩短为:
from django.utils import simplejson
from google.appengine.ext import webapp, db
from webapp import template
其次假设你在my_module.py
中有^导入在my_module2.py中你可以这样做:
来自my_module2.py导入webapp,db,tempate
示例:
In [5]: from my_module2 import MyMath2, MyMath
In [6]: m2 = MyMath2()
In [7]: m2.my_cos(3)
Out[7]: 0.94398413915231416
In [8]: m = MyMath()
In [9]: m.my_sin(3)
Out[9]: 0.32999082567378202
其中my_module2是:
from my_module import math, MyMath
class MyMath2(object):
the_meaning_of_life = 42
def my_cos(self, number):
return math.cos(number * 42)
和my_module1是:
import math
class MyMath(object):
some_number = 42
def my_sin(self, num):
return math.sin(num * self.some_number)
干杯, 希望能帮助到你 ALEP