具有大类层次结构的继承

时间:2018-06-21 08:11:32

标签: python oop inheritance architecture

假设您正在创建一个涉及大型类层次结构的项目,其中涉及相当复杂的__init__方法,这些方法从叶类到根始终调用父级,就像生活的分类法一样。

每个Organism都可能有许多参数,它们之间以及层次结构中的任何专门参数都在其中共享。

假设在开发过程中您意识到可能需要向有机体的构造函数添加另一个参数,每个有机体都应该可以使用该参数来构造。构造类以将此参数添加到类层次结构的最佳方法是什么?我可以想到两种方式:

  1. 将新参数添加到每个__init__方法以及对super()的每次调用中。__init __

优点:

  • 显性

缺点:

  • 涉及许多可能繁琐的手动编辑
  • 庞大
  • 无法在高级别课程中设置默认值

示例:

class Organism:
    def __init__(a=1, b=2, ...):
        ...

...

class HomoSapiens(Homo):
    def __init__(a=None, b=None, ..., c=1, d=2):
        ...
        super().__init__(a=a, b=b, ..., c=c)

class CanisFamiliaris(Canis):
    def __init__(a=None, b=None, ..., e=1, f=2):
        ...
        super().__init__(a=a, b=b, ..., e=e)
  1. 相反,定义类结构以在每个__init__中使用* args或** kwargs,并将它们传递到层次结构中

优点:

  • 更容易写
  • 可能会弄清楚哪些类是参数的“特征”类
  • 似乎更简单

缺点:

  • 隐式
  • 不清楚作为智人性质的智人可以使用哪些参数

示例:

class Organism:
    def __init__(a=1, b=2, ...):
        ...

...

class HomoSapiens(Homo):
    def __init__(c=1, d=2, **kwargs):
        ...
        super().__init__(c=c, **kwargs)

class CanisFamiliaris(Canis):
    def __init__(e=1, f=2, **kwargs):
        ...
        super().__init__(e=e, **kwargs)

第二个选项很诱人,因为在签名更改的情况下,它涉及的编辑要少得多,但是它会牺牲太多的清晰度吗?

0 个答案:

没有答案