区分覆盖和重载

sta*_*ion 2 python

我在python中有两个类

  1. 通常醉酒

通常的drunk类继承自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)
Run Code Online (Sandbox Code Playgroud)

现在通常的醉酒类有两个名为move但具有不同参数的方法.

那么在这种情况下它是覆盖还是超载?

Tho*_*mas 9

它压倒一切.Python不支持重载.

也就是说,用一个接受不同参数的方法覆盖一个方法,特别是当它接受参数少于基类方法时,这是一个坏主意.考虑:

some_drunk.move(field, cp)
Run Code Online (Sandbox Code Playgroud)

如果some_drunk是常规Drunk,这是有效的.但如果它是a UsualDrunk,它会将值传递cpdist参数,这可能不是预期的.

  • @maid450 @ user567797:Python完全面向对象.重载并没有真正连接到OOP,即使它通常在静态OO语言中找到.不包含重载(在语言级别 - 您可以自己动态执行此操作),因为在动态语言中无法静态执行. (3认同)