我有这两个类:
class Shape(object):
def __init__(self, start_point, *args):
self.vertices = []
self.__make_vertices(start_point, *args)
def __make_vertices(self, start_point, *args):
print "Not Implemented: __make_vertices"
def __getitem__(self, *args):
return self.vertices.__getitem__(*args)
class Cube(Shape):
def __init__(self, start_point, side_length):
Shape.__init__(self, start_point, side_length)
def __make_vertices(self, start_point, side_length):
append = self.vertices.append
start_point = Vector(*(start_point))
i, j, k = side_length*I, side_length*J, side_length*K
append(start_point)
append(self.vertices[-1] - k)
append(self.vertices[-1] - j)
append(self.vertices[-1] + k)
append(self.vertices[-1] - i)
append(self.vertices[-1] - k)
append(self.vertices[-1] + j)
append(self.vertices[-1] + k)
print self.vertices
当我创建一个新的Cube
时,我预计会调用我在Cube类中定义的__make_vertices
函数,但我会不断收到Shape
类{ {1}}函数打印出来。我误解了什么?
答案 0 :(得分:7)
您缺少name mangling:
__spam
形式的任何标识符(至少两个前导下划线,最多一个尾随下划线)在文本上替换为_classname__spam
,其中classname是当前类名,前导下划线被剥离。只要它出现在类的定义中,就可以在不考虑标识符的句法位置的情况下完成这种修改。
换句话说,当你专门不希望希望子类覆盖它们时,你应该只使用以两个下划线开头的属性/方法名称,而是提供它们自己的私有版本。这种情况很少见,因此通常您根本不需要使用双下划线名称。