如何在不创建许多模块的情况下将 python 类 分发到不同的源文件中?
How to distribute python classes into different source files without creating many modules?
我有一些相关的 classes 放在这样的包中:
\cool
\__init__.py
class CoolObj: ...
class CoolStr(CoolObj): ...
class CoolName(CoolStr): ...
class CoolSound(CoolObj): ...
我使用这些 class 是这样的:
import cool
cn = cool.CoolName()
...
这个 __init__.py
文件太长了。如果我能像这样把每个 class 放在它们自己的文件中就好了:
\cool
\__init__.py
\cool_obj.py
class CoolObj: ...
\cool_str.py
class CoolStr(CoolStr): ...
\cool_name.py
class CoolName(CoolStr): ...
\cool_sound.py
class CoolSound(CoolObj): ...
但是,这样一来,这些文件就变成了 modules 并且我必须按如下方式使用它们,这有点冗长。
from cool import cool_obj, cool_str, cool_name, cool_sound
cn = cool_name.CoolName()
有没有办法把源代码放在单独的文件中,同时又能像我现在这样用简洁的语法引用它们?
更好的是,python
中有没有像 C#
中的 partial class 这样的东西允许您传播相同的 class 在不同的文件中?
在您的 __init__.py
中,您可以进行导入以缩短在其他地方使用它们的时间。所以 __init__.py
中的一行可能是
from cool_name import CoolName
稍后你可以做
from cool import CoolName
您可能还想将 __all__
视为解决此问题的另一种方法。您可以在 cool.__init__.py
模块中导入各种内容,只要包含 __all__
,您就可以明确指定要导出的对象。
关于部分 classes,我几乎可以肯定 Python 不支持通过常规 class 定义的这种功能。您可以通过在运行时将不同的函数注入 class 来将其组合在一起,但这肯定会很混乱。 This answer 更深入地审视了这条道路。
我有一些相关的 classes 放在这样的包中:
\cool
\__init__.py
class CoolObj: ...
class CoolStr(CoolObj): ...
class CoolName(CoolStr): ...
class CoolSound(CoolObj): ...
我使用这些 class 是这样的:
import cool
cn = cool.CoolName()
...
这个 __init__.py
文件太长了。如果我能像这样把每个 class 放在它们自己的文件中就好了:
\cool
\__init__.py
\cool_obj.py
class CoolObj: ...
\cool_str.py
class CoolStr(CoolStr): ...
\cool_name.py
class CoolName(CoolStr): ...
\cool_sound.py
class CoolSound(CoolObj): ...
但是,这样一来,这些文件就变成了 modules 并且我必须按如下方式使用它们,这有点冗长。
from cool import cool_obj, cool_str, cool_name, cool_sound
cn = cool_name.CoolName()
有没有办法把源代码放在单独的文件中,同时又能像我现在这样用简洁的语法引用它们?
更好的是,python
中有没有像 C#
中的 partial class 这样的东西允许您传播相同的 class 在不同的文件中?
在您的 __init__.py
中,您可以进行导入以缩短在其他地方使用它们的时间。所以 __init__.py
中的一行可能是
from cool_name import CoolName
稍后你可以做
from cool import CoolName
您可能还想将 __all__
视为解决此问题的另一种方法。您可以在 cool.__init__.py
模块中导入各种内容,只要包含 __all__
,您就可以明确指定要导出的对象。
关于部分 classes,我几乎可以肯定 Python 不支持通过常规 class 定义的这种功能。您可以通过在运行时将不同的函数注入 class 来将其组合在一起,但这肯定会很混乱。 This answer 更深入地审视了这条道路。