当前位置: 首页 > 面试题库 >

从子目录中的不同文件导入类

南门正业
2023-03-14
问题内容

这是我正在使用的结构:

directory/
          script.py
          subdir/
                 __init__.py
                 myclass01.py
                 myclass02.py

我想要做的就是在script.py中定义的类进口myclass01.pymyclass02.py。如果我做:

from subdir.myclass01 import *

对于中定义的类,它工作正常myclass01.py。但是使用此解决方案时,如果在不同文件中定义了许多类,subdir并且我想导入所有这些类,则必须为每个文件键入一行。必须有一个捷径。我试过了:

from subdir.* import *

但这没有解决。

编辑 :这是文件的内容:

这是__init__.py__all__按照Apalala的建议使用):

__all__ = ['MyClass01','MyClass02']

这是myclass01.py

class MyClass01:
    def printsomething():
        print 'hey'

这是myclass02.py

class MyClass02:
    def printsomething():
        print 'sup'

这是script.py

from subdir import *
MyClass01().printsomething()
MyClass02().printsomething()

这是我尝试运行时得到的跟踪script.py

File "script.py", line 1, in <module>
    from subdir import *
AttributeError: 'module' object has no attribute 'MyClass01'

问题答案:

尽管此处使用的名称与问题的目录结构中显示的名称不同,但是您可以使用我对名为Namespacing和classes的问题的答案。在__init__.py这里所示本来还允许usepackage.py脚本已经这样写的(package映射到subdir你的问题,并Class1myclass01等):

from package import *

print Class1
print Class2
print Class3

修订(更新):

糟糕,抱歉,我的其他答案中的代码并未完全满足您的要求-
它只会自动导入任何程序包子模块的名称。为了使其也从每个子模块导入命名属性,需要多几行代码。这是软件包__init__.py文件的修改版本(在Python
3.4.1中也可以使用):

def _import_package_files():
    """ Dynamically import all the public attributes of the python modules in this
        file's directory (the package directory) and return a list of their names.
    """
    import os
    exports = []
    globals_, locals_ = globals(), locals()
    package_path = os.path.dirname(__file__)
    package_name = os.path.basename(package_path)

    for filename in os.listdir(package_path):
        modulename, ext = os.path.splitext(filename)
        if modulename[0] != '_' and ext in ('.py', '.pyw'):
            subpackage = '{}.{}'.format(package_name, modulename) # pkg relative
            module = __import__(subpackage, globals_, locals_, [modulename])
            modict = module.__dict__
            names = (modict['__all__'] if '__all__' in modict else
                     [name for name in modict if name[0] != '_'])  # all public
            exports.extend(names)
            globals_.update((name, modict[name]) for name in names)

    return exports

if __name__ != '__main__':
    __all__ = ['__all__'] + _import_package_files()  # '__all__' in __all__

或者,您可以将以上内容放入包目录中单独的.py模块文件中(例如),_import_package_files.py并从包中使用它,__init__.py如下所示:

if __name__ != '__main__':
    from ._import_package_files import *  # defines __all__
    __all__.remove('__all__')  # prevent export (optional)

无论您以什么名字命名文件,它都应该以_下划线字符开头,这样它就不会import递归地尝试自身。



 类似资料:
  • 调试和运行时,我在 pycharm 中遇到输入错误。 我的项目结构根是正确的,< code >等等。/HW3/。以便< code>HW3是根目录。 我在HW3中有一个子文件夹,还有一个文件。我在中有另一个名为的文件。 在中,我有以下导入结构, 这会产生一个输入错误, 但是,在完全相同的项目中,在另一个名为 data 的目录(与 util 相同级别)中,我有一个文件 /,它也使用类似的导入语句从 u

  • 问题内容: 我有一个名为“ ClassA”的Python类,另一个应该导入“ A ClassB”的ClassA的Python类。目录结构如下: 我将如何使用,以便ClassB可以使用ClassA? 问题答案: 您确实应该使用软件包。然后将MainDir放置在文件系统中sys.path上的某个点(例如… / site- packages)上,然后可以在ClassB中说: 您只需要在每个目录中放置命名

  • 我在Python 3.3项目中有一个名为/models的目录。 从我的我只是做了一个 在我的: 这在我的应用程序中非常有效。 我有一个依赖于另一个模型的模型,例如在我的我需要导入。py。当我这样做时: 我得到错误。 如何从同一模块/目录中的文件A导入类B?

  • 我有一个这样的文件结构: 在笔记本中的文件我想从和。 我已经找到了这个问题的答案,可以在每个笔记本中使用以下代码行,并每次将这些代码行作为第一个单元格运行: 有没有更好的办法?如果我有很多笔记本中的文件文件夹,我是否必须将这些代码行粘贴到每一行的开头?有更好、更简约或更干净的方法吗?

  • 问题内容: 我坚信这只是一种语法-但是我不知道为什么我的代码: 将无法正常工作-它显然可以进入“ testfilefolder”文件夹,并告诉我该文件在那里,即未找到错误消息“ file2.txt”。因此它可以找到它来告诉我找不到它… 但是,我得到了这段代码: 奖金-这是做我想做的事情的好方法吗(从文件中读取并计算单词的出现频率)?这是我使用Python的第一天(尽管我有很多编程经验。) 我必须说

  • 问题内容: 我有一个存储所有.py文件的目录。 我想从使用类user.py和dir.py在main.py。 如何将这些Python类导入main.py? 此外,如果user.py在子目录中,如何导入类? 问题答案: Python 2 在与文件相同的目录中创建一个名为的空文件。这将向Python表示“可以从此目录导入”。 然后做… 如果文件位于子目录中,则也应如此-将子目录也放入子目录中,然后使用带