Python模块可以使用其他文件的导入吗?

时间:2009-05-11 23:48:30

标签: python

我有这样的事情:

 # 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

这是我想避免的。

6 个答案:

答案 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

相关问题