函数未在子类中被重写

Bro*_*eph 2 python inheritance

我有这两个类:

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
Run Code Online (Sandbox Code Playgroud)

当我创建一个新的时Cube,我期望__make_vertices我在Cube类中定义的函数将被调用,但是我继续得到Shape__make_vertices函数打印出来的消息.我有什么误会?

Bre*_*arn 7

你缺少名字错误:

表单的任何标识符__spam(至少两个前导下划线,最多一个尾随下划线)在文本上替换为_classname__spam,其中classname是当前类名称,其中前导下划线被剥离.只要它出现在类的定义中,就可以在不考虑标识符的句法位置的情况下完成这种修改.

换句话说,当您特别希望子类覆盖它们时,您应该只使用以两个下划线开头的属性/方法名称,而是提供它们自己的私有版本.这种情况很少见,因此通常您根本不需要使用双下划线名称.