区分重写与重载
我在Python里有两个类:
- Drunk(醉酒)
- 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
这个参数,这可能不是你想要的结果。