【问题标题】:Defining subclasses with common import methods使用通用导入方法定义子类
【发布时间】:2016-04-26 21:39:09
【问题描述】:

我一直在构建一个 python 图像处理模块,用于处理与激光束相关的图像。图像的内容不同(激光束图像、散射光图像等),文件类型因用于捕获图像的仪器而异。但是任何一种文件类型都可能包含任何一种内容类型。

模块目前的结构是

  • 父类:包含所有类型内容通用的方法
    • 子类 1: 包含对内容类型 1 有用的方法
      • Grandchild Class 1:只有 __init__() 用于导入文件类型 a 的语句
      • Grandchild Class 2:只有 __init__() 用于导入文件类型 b 的语句
    • 子类 2: 包含对内容类型 2 有用的方法
      • Grandchild Class 1:只有 __init__() 用于导入文件类型 a 的语句
      • Grandchild Class 2:只有 __init__() 用于导入文件类型 b 的语句

问题在于孙类本质上是相同的,因为它们包含用于导入不同类型文件的代码,这些文件可能包含来自任一子类的内容。

有没有更优雅/pythonic 的方式来做到这一点?


我应该注意到,不同的文件类型需要不同的预处理,所以解决方案并不像使用 e.g.可以识别标准图像文件扩展名的 PIL。

【问题讨论】:

  • 不提供代码,这个问题只是一个很难读的列表。尝试编辑并提供我们都可以使用的东西。
  • 我会创建 2 个 mixins 类,1 个用于导入文件类型 a,另一个用于导入文件类型 b,并相应地将它们添加到子类中
  • @Apero 我不熟悉混入;这基本上回答了我的问题。谢谢!
  • @Jim 对于大量的子类,我最初编写的框架代码感觉比这个列表可读性差得多,但也许我弄错了。无论如何,Apero 的评论基本上回答了我的问题。
  • 这是可以理解的,我猜。我希望我没有通过评判你创建列表的技能来冒犯你。无论如何,如果您可以为这个问题提供一个好的答案,那就这样做(但没有大的复杂列表!)。如果没有,您可以随时删除整个 Q。:-)

标签: python file class import subclass


【解决方案1】:

使用 2 个混合类:

class FileTypeAMixin:
    <logic>

class FileTypeBMixin:
    <logic>

class Parent:
    <logic>

class Child1(Parent):
    <logic>

class Child2(Parent):
    <logic>

class Child1GrandChild1(FileTypeAMixin, Child1):
    <logic>

class Child1GrandChild2(FileTypeBMixin, Child1):
    <logic>

class Child2GrandChild1(FileTypeAMixin, Child2):
    <logic>

class Child2GrandChild2(FileTypeBMixin, Child2):
    <logic>

编辑 正如 OP 所指出的,建议始终将 mixins 放在父类之前,以防止在调用 super() 时出现奇怪的 MRO 行为,以防每个父类/mixins 都实现了相同的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多