根据Python中的初始化函数的参数来改变实例化类的最佳方法是什么?例如,对于四叉树,如果元素数低于某个阈值,则需要返回叶子而不是分支。另一个例子是一个图表,它可以由邻接矩阵或列表支持,具体取决于它初始化的数据。
我能想到的最明显的方法是使用工厂函数来确定应该初始化所讨论的类的哪个子类。有没有更好,更pythonic 这个怎么样?
在这个问题的一个特别棘手的例子中,我有一个可以由任何类型的序列或dict类型支持的数据结构。使用的支持/子类取决于它所馈送的数据类型。在一个静态类型的语言中,我可以简单地使用函数重载,但在Python中我要么显式调用isinstance,要么使用一堆“try ... catch AttributeError”。这两个看起来都很糟糕。使用上面的工厂功能解决方案,我看不到干净的方法。 (我意识到这是一个不同的问题,但这是一个很大的案例让我试图解决这个问题。)
答案 0 :(得分:2)
查看__new__
。 Documentation
答案 1 :(得分:2)
你可以使用__new__
,但工厂功能是不错的pythonic方式。
答案 2 :(得分:1)
在他的Advanced C++ Programming Styles and Idioms书中,James Coplien讨论了如何在C ++中模拟virtual constructors(pdf version)。它们必须被模拟,因为语言本身不支持它们。这是对基类构造函数的调用导致返回子类对象的指针,这取决于传递的参数(当然,只有当您使用C ++的 new 运算符动态分配和创建对象时才会发生这种情况。 )。
我发现实现Python中提出的许多概念是可能的,特别是因为与C ++不同,类是Python中的第一类对象,它具有元类。
基本上,基类构造函数成为工厂函数,并且在任何工厂函数中,它需要额外的努力才能使它们可扩展......在某种意义上,它们不必知道可能派生的每个可能的子类后来。虽然这种方法存在一些局限性,但许多有用的应用程序都是可能的(而你的声音可能就像是我的其中之一)。