python - 是否有任何 Python 等效于部分类?

标签 python partial-classes

使用"new"样式类(我在 python 3.2 中)有没有办法将一个类拆分为多个文件?我有一个大类(从面向对象设计的角度来看,考虑到耦合等,它确实应该是一个类,但为了便于编辑类,最好将其拆分为几个文件。

最佳答案

如果您的问题真的只是在编辑器中处理一个大型类,那么我实际寻找的第一个解决方案是解决问题的更好方法。第二种解决方案将是一个更好的编辑器,最好是带有代码折叠功能的编辑器。

也就是说,有几种方法可以将一个类分解为多个文件。 Python 允许您通过将 __init__.py 放入其中来将文件夹用作模块,然后可以从其他文件中导入内容。我们将在每个解决方案中使用此功能。首先创建一个名为 bigclass 的文件夹。

  1. 在文件夹中放置最终将构成您的类的各种 .py 文件。每个都应该包含最终类的函数和变量定义,not 类。在同一文件夹中的 __init__.py 中写入以下内容以将它们连接在一起。

    class Bigclass(object):
    
        from classdef1 import foo, bar, baz, quux
        from classdef2 import thing1, thing2
        from classdef3 import magic, moremagic
        # unfortunately, "from classdefn import *" is an error or warning
    
        num = 42   # add more members here if you like
    

    这样做的好处是您最终会得到一个直接从 object 派生的类,这在您的继承图中会看起来不错。

  2. 您可以使用多重继承来组合类的各个部分。在您的各个模块中,您将为 Bigclass 编写一个包含类的部分的类定义。然后在你的 __init__.py 中写:

    import classdef1, classdef2, classdef3
    
    class Bigclass(classdef1.Bigclass, classdef2.Bigclass, classdef3.Bigclass):
        num = 42   # add more members if desired
    
  3. 如果多重继承成为问题,您可以使用单继承:只需让每个类以链式方式从另一个类继承即可。假设您没有在一个以上的类中定义任何内容,则顺序无关紧要。例如,classdef2.py 就像:

    import classdef1
    class Bigclass(classdef1.Bigclass):
         # more member defs here
    

    classdef3 将从 classdef2 导入 Bigclass 并添加到其中,依此类推。您的 __init__.py 只会导入最后一个:

    from classdef42 import Bigclass
    

我通常更喜欢 #1,因为它更明确地说明了您从哪些文件导入哪些成员,但这些解决方案中的任何一个都可以为您工作。

要在任何这些场景中使用该类,您只需导入它,使用文件夹名称作为模块名称:from bigclass import Bigclass

关于python - 是否有任何 Python 等效于部分类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9638446/

相关文章:

c# - 有没有一种工具可以将 C# 部分类文件重新组装成一个类源代码文件?

c# - 在 Entity Framework 中向部分类添加接口(interface)不起作用

list - Grails中所有域类的列表

python - 从 C 结构创建 PyBuffer

python - 为使用 PyInstaller 创建的可执行文件从 dock 隐藏终端

python - 为什么 Python 的 re 模块在这个方法中不起作用?

c# - 部分类文件名的命名约定?

c# - 部分类和数据访问代码

Python - 字典未正确更新

python - Aerospike 通过 TTL 计算所有过滤器