好的,所以我对面向对象的东西不太好,而且我试图找出"对"这样做的方法。
作为一个人为的例子,类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
类有额外的参数,不能直接与它一起使用。
正确的方法是什么?使它们成为其他一些对象的子类(但那会是几何形状)?是否有方法可以使用仅由子类使用的私有初始化内容?
答案 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__()
,只会调用辅助函数。