【发布时间】:2019-12-12 02:40:56
【问题描述】:
我正在与一个反复出现的噩梦作斗争,即不知道在一个小的类层次结构中管理__init__ 的参数的最佳方法是什么。我已经阅读了几篇关于使用super() 有多好的问答和文章,我理解它,但是许多示例只是处理__init__ 的基本情况而没有参数,这很少是我的情况。
举个例子,我有一个类root,属性为tags和description,它看起来像:
class Root(object):
"""An object that can be tagged."""
def __init__(tags = None, description = None):
self.tags, self.description = tags, description
现在我可以子类化了,但是 tags 和 description 的参数呢?我可以在子类中明确接受它们:
class Derived(Root):
def __init__(self,tags = None, description = None):
super().__init__(tags = tags, description = description)
或者我可以通过*args, **kwargs传递它们
如果我决定,第一个解决方案迫使我为所有派生类重写例程描述符(以及文档和文档字符串),例如在Root 中添加或删除参数。第二个自动工作,但它隐藏了自省的参数名称;如果任何其他例程需要接受来自*args, **kwargs 的可选参数,则需要手动过滤。
第三种方法可能是显式地重新分配子类中的属性,而不调用super.__init__,但这对我来说看起来是重复的代码,所以它可能不太好。
处理这种情况的最佳方法是什么?
【问题讨论】:
标签: python python-3.x inheritance multiple-inheritance