初始化一个带有仅由子类使用的参数的类

时间:2015-11-28 16:08:23

标签: python class oop

好的,所以我对面向对象的东西不太好,而且我试图找出"对"这样做的方法。

作为一个人为的例子,类Circle在概念上是LogarithmicSpiral的子类,因为圆是螺旋的一个特例,但因为它是一种更受限制的东西,所以&#39 ;是一个以不同的,更加数字准确的方式指定它的机会:

mycircle = Circle(radius=, arc_length=, number_of_points=)

而不是

myspiral = LogarithmicSpiral(start_point=, step_vector=, number_of_points=)

为了保持子类关系,初始化的内容仍然在LogarithmicSpiral,但它需要变成类似LogarithmicSpiral(start_point=None, step_vector=None, radius=None, arc_length=None, number_of_points=)的东西,并且不能指定相互排斥的参数同时。但是LogarithmicSpiral类有额外的参数,不能直接与它一起使用。

正确的方法是什么?使它们成为其他一些对象的子类(但那会是几何形状)?是否有方法可以使用仅由子类使用的私有初始化内容?

(这是https://github.com/scipy/scipy/pull/4607

1 个答案:

答案 0 :(得分:1)

没有规则说子类必须接受相同的参数,或者基类必须预测子类所采用的参数。

您的子类有自己的__init__方法,并带有自己的参数。您可以根据需要随意重复使用LogarithmicSpiral.__init__。您可以将Circle的参数转换为LogarithmicSpiral.__init__方法的参数:

class Circle(LogarithmicSpiral):
    def __init__(self, radius, arc_length, number_of_points):
        # calculate start_point and step_vector
        # ...
        LogarithmicSpiral.__init__(self, start_point, step_vector, number_of_points)

但如果类实现的其余部分不需要LogarithmicSpiral.__init__生成的任何属性,那么您没有义务。

如果它有助于实现,您可以随意将一些工作委托给一个辅助方法,一个以初始_下划线开头。 LogarithmicSpiral.__init__()然后会调用它,但Circle.__init__()

也可以
class LogarithmicSpiral(Shape)
    def __init__(self, start_point, step_vector, number_of_points):
        # do some work, calculating some values like arg1, arg2, arg3
        self._setup_shape_params(arg1, arg2, arg3)

    def _setup_shape_params(arg1, arg2, arg3):
        # set up the instance attributes needed for a shape


class Circle(LogarithmicSpiral):
    def __init__(self, radius, arc_length, number_of_points):
        # do some work, calculating some values like arg1, arg2, arg3
        self._setup_shape_params(arg1, arg2, arg3)

此处Circle.__init__()不会直接调用LogarithmicSpiral.__init__(),只会调用辅助函数。