代码之家  ›  专栏  ›  技术社区  ›  Federico Builes

一个python模块可以使用来自另一个文件的导入吗?

  •  3
  • Federico Builes  · 技术社区  · 16 年前

    我有这样的东西:

     # a.py  
     import os
     class A:
       ...
    
     # b.py
     import a
     class B(A):
       ...
    

    在B类(B.py)中,我希望能够使用A.py中导入的模块(在本例中是OS)。是否可以在python中实现这种行为,或者应该在两个文件中导入模块?

    编辑:我不担心导入时间,我的问题是导入块对文件的视觉混乱。我最终在每个控制器(请求处理程序)中都有这样的东西:

     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 回复  |  直到 16 年前
        1
  •  13
  •   Unknown    16 年前

    是的,您可以通过访问a.os使用来自其他文件的导入。

    但是,蟒蛇式的方法是只导入您需要的精确模块,而不从中创建链(这可能导致循环引用)。

    导入模块时,将编译代码并将其插入到名称字典中->模块对象。字典位于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 *
    
        2
  •  1
  •   John Fouhy    16 年前

    只需再次导入模块。

    在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
    >>> 
    
        3
  •  0
  •   viraptor    16 年前

    您应该单独导入它。但是,如果确实需要转发某些功能,可以从函数返回模块。只是:

    import os
    def x:
       return os
    

    但看起来插件功能-对象+继承可以更好地解决这个问题。

        4
  •  0
  •   Tom Leys    16 年前

    听起来你想用 python packages . 看看那些。

        5
  •  0
  •   a paid nerd    16 年前

    是的。一旦导入模块,该模块就成为当前模块的属性。

    # 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(...)
        ....
    
        6
  •  0
  •   Ale    16 年前

    首先,您可以将其缩短为:

    from django.utils import simplejson
    from google.appengine.ext import webapp, db
    from webapp import template
    

    其次,假设您在my_module.py中有这些^导入。

    在我的模块2.py中,您可以执行以下操作:

    从我的模块2.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
    

    其中,我的模2是:

    from my_module import math, MyMath
    
    class MyMath2(object):
    
        the_meaning_of_life = 42
    
        def my_cos(self, number):
            return math.cos(number * 42)
    

    我的_模块1是:

    import math
    
    class MyMath(object):
    
        some_number = 42
    
        def my_sin(self, num):
            return math.sin(num * self.some_number)
    

    干杯, 希望它有帮助 阿莱普