Python中的继承:在现实生活中正确使用__init__和super()

问题描述 投票:0回答:2

我经常遇到的恶梦之一就是不知道什么是在较小的类层次结构中管理__init__参数的最佳方法。我已经阅读了一些有关如何使用super()的问题的问答,并且我理解它,但是许多示例仅处理了__init__的基本情况而没有参数,这在我的情况中很少见。

举个例子,我有一个具有属性roottags的类description,它看起来像:

class Root(object):
    """An object that can be tagged."""
    def __init__(tags = None, description = None):
        self.tags, self.description = tags, description

现在我可以继承,但是参数tagsdescription呢?我可以在子类中明确接受它们:

class Derived(Root):
    def __init__(self,tags = None, description = None):
        super().__init__(tags = tags, description = description)

或者我可以通过*args, **kwargs传递它们>

第一个解决方案迫使我为所有派生类重写例程描述符(以及文档和文档字符串),例如在Root中添加或删除参数。第二个自动工作,但是它对自省隐藏了参数名;并且如果其他例程需要接受*args, **kwargs中的可选参数,则需要进行手动过滤。

第三种方法可能是在不调用super.__init__的情况下显式重新分配子类中的属性,但这对我来说似乎是重复的代码,因此可能不好。处理这种情况的最佳方法是什么?

我正反复发生的噩梦中的一个,就是不知道在小型类层次结构中为__init__管理参数的最佳方法是什么。我已经阅读了一些问答,以及有关...

python python-3.x inheritance multiple-inheritance
2个回答
0
投票

我建议使用*args,然后使用**kwargs,以允许该类的用户根据需要通过位置方式传递标签和描述。这可能会使您的构造函数更加复杂,因为要弄清楚其中包含超类构造函数的每个参数的逻辑,但它将为您和其他开发人员将来的使用提供更好的体验。


0
投票

您应该使用*kwargs,但不仅要传递tagsdescription。相反,它用于接受MRO中某些other

© www.soinside.com 2019 - 2024. All rights reserved.