首先:不要这样做。在
也许有更好的方法来解决你的具体问题。如果您必须为一个类定义大量相关的方法,并且希望使用模块来组织这些方法,那么就给每个模块一个基类,在这些类上定义方法,然后使用子类将模块中的类合并为一个。见下文。在Why is importing all in a class not allowed
因为class语句是一个作用域的命名空间,在编译时Python需要知道哪些名称被引用为全局变量,并将这些名称与本地名称区分开来。这在函数中尤为重要,在函数中,通过知道在编译时使用的名称,可以高度优化本地命名空间。对于类语句,“local”名称将成为类属性。当涉及到动态局部名称时,类语句比函数更灵活,但是将任意的、动态的名称列表导入到类定义中从未被视为值得支持的用例。在how can I get around this
您可以反省模块并获得Python将导入的所有相同名称,并使用setattr()或通过分配给locals()字典(类语句是后者唯一实际工作的地方)在类上动态设置这些名称。^{} statement documentation列出导入的内容:如果模块定义__all__,那么它将用作要导入的名称列表
否则,将导入所有公共名称(名称不以_开头的所有全局变量)。在
因此,以下操作将获得与在类语句中为Foo使用from bar import *完全相同的效果:import bar
def _import_all(module, class):
namespace = vars(module)
public = (name for name in namespace if name[:1] != "_")
for name in getattr(module, "__all__", public):
setattr(class, name, namespace[name])
class Foo:
pass
_import_all(bar, Foo)
或者,这绝对是更“hack-y”,这取决于内部Python实现细节:
^{pr2}$
is there a better way to split multiple methods up into different files?
是的,使用类。将所有这些方法放在单独的模块中,每个都放在一个类中,然后从每个模块导入这些类并将其用作基类:import bar, spam
class Foo(bar.Base, spam.Base):
pass
其中bar.py将定义Base类:class Base:
def print_bar(self):
print("bar")
spam等也一样。您可以根据需要向这些基本mixin类添加和删除方法,并且组合基类的import语句不会改变。在