区分重写与重载

2 投票
1 回答
7935 浏览
提问于 2025-04-16 13:36

我在Python里有两个类:

  1. Drunk(醉酒)
  2. Usual Drunk(普通醉酒)

普通醉酒这个类是从醉酒这个类继承来的,并且对它的move方法进行了新的实现,具体代码如下:

class Drunk:
    def __init__(self,name):
        self.name = name

    def move(self,field,cp,dist=1):
        if field.getDrunk().name!= self.name:
            raise ValueError('Drunk not in the field!')
        for i in range(dist):   
            #pt = CompassPt(random.choice(CompassPt.possibles))
            field.move(cp,1)


class UsualDrunk(Drunk):
    def move(self,field,dist=1):
        cp = random.choice(CompassPt.possibles)
        Drunk.move(self,field,CompassPt(cp),dist)

现在,普通醉酒这个类有两个叫做move的方法,但它们的参数不同。

那么在这种情况下,这算是重写(overriding)还是重载(overloading)呢?

1 个回答

9

这是重写。Python不支持重载。

不过,用一个接受不同参数的方法来重写一个方法,尤其是当这个新方法接受的参数比原来的方法时,这通常是个坏主意。想想看:

some_drunk.move(field, cp)

如果some_drunk是一个普通的Drunk对象,这样做是没问题的。但如果它是一个UsualDrunk对象,就会把cp的值传给dist这个参数,这可能不是你想要的结果。

撰写回答