从python中的文件返回类的实例

2024-05-17 14:42:59 发布

您现在位置:Python中文网/ 问答频道 /正文

每个py类中都有一个包含各种程序定义的py包。我想列出一个列表,其中每个条目都是其中一个类的实例。此外,我的程序不知道包中有多少个文件,也不知道文件或类的名称,所以我不能只导入每个文件。理想情况下,我应该能够修改包的内容(取出文件、放入新文件等),而不必重写程序的其他部分。有办法吗?在

最初,我在每个文件中都有一个“if_uuname_u==”uu main_uu':return foo()'行,并尝试使用execfile()附加到列表中,但显然这行不通。有什么想法吗?在

抱歉,如果这有点模糊。如果需要的话,我会尽力澄清。我使用的是python2.5.4。在

编辑:

我的程序是一个地下城和龙的随机字符生成器。我为程序需要的每种主要数据类型做了一个包。我有一个用于类、种族、项目等的包,当生成一个字符时,我的程序会列出每种数据类型的列表,以便在生成字符时对其进行排序。例如,当装备一个角色时,程序可以查看武器列表,过滤掉所有不适合该角色的武器,然后从剩余的武器中随机选择。在

我不想指定文件名,因为我希望以后能够轻松地添加到此程序中。如果以后我想在程序中添加更多的武器类型,我只需编写一些新的类描述并将它们放入武器包中,程序就可以使用它们,而不需要我编辑任何其他代码。在


Tags: 文件实例py程序名称角色编辑列表
3条回答

这听起来有点糟糕。如果你详细说明这个问题,我们可以用其他方法帮助你解决它,那可能会更好。然而,你想要的并不难:

import types
import my_package

my_package_members = [getattr(my_package, i) for i in dir(my_package)]
my_modules = [i for i in my_package_members if type(i) == types.ModuleType]

instances = []

for my_module in my_modules:
    my_module_members = [getattr(my_module, i) for i in dir(my_module)]
    my_classes = [i for i in my_module_members
                  if type(i) in (types.TypeType, types.ClassType)]
    for my_class in my_classes:
        instances.append(my_class())

编辑:稍微简化了代码。在

如果您愿意做更多的工作,可以使用^{}'s entry points来公布和发现相关的类。Fedora帐户系统uses this提供{a3}。在

要做到这一点,你需要做以下事情:

  • 让代码枚举包含代码的源文件。在
  • 对于每个源文件,将文件中指定的代码导入到新模块中。在
  • 对于每个模块,找到包含的所有类,实例化每个类并将其添加到最终列表中。在

轮流参加每一部分:

  • 要枚举源文件,请使用os.walkos.path查找文件并构建到源的完整路径。在
  • 要从给定的源文件动态导入代码,可以执行^{},其中my_file是指向源文件的完整路径,my_dict是返回结果代码的字典(例如,源文件中声明的任何类都将成为此dict的成员)。注意,只有当导入的文件不是有效的python模块/包层次结构的一部分(包中有一个init.py文件)时,才需要使用此方法—如果是,则可以使用import()。在
  • 要枚举给定模块中声明的类,可以使用inspect.getmembers()。在

相关问题 更多 >