具有大类层次结构的继承

2024-05-17 15:51:13 发布

您现在位置:Python中文网/ 问答频道 /正文

假设您正在创建一个涉及大型类层次结构的项目,它涉及相当复杂的初始化方法,这些方法从叶类一直到根调用父类,就像生命的分类法一样

每个Organism都有许多参数,这些参数与层次结构中的任何专门参数一起共享

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

  1. 将新参数添加到每个\uuu init \uuuuuuuuuu方法,以及对super()的每个调用中

优点:

  • 显式

缺点:

  • 可能会涉及大量繁琐的手动编辑
  • 笨重的
  • 无法在高级类中设置默认值

示例:

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. 相反,定义类结构以在每个初始化中使用*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)

第二种选择很有诱惑力,因为在签名更改的情况下,它涉及的编辑要少得多,但它是否牺牲了太多的清晰度


Tags: 方法none编辑示例参数层次结构initdef