2011-03-13 46 views
2

我有在python兩類區分首要和重載

  1. 常用醉

通常醉類從醉繼承,並提供它的移動方法的新的實現如圖所示低於

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但具有不同的參數。

那麼在這種情況下是重寫還是重載?

+2

如果你在2.6中,你應該從固有的物體中醉。 – 2011-03-13 09:50:36

回答

9

它是壓倒一切的。 Python不支持重載。

也就是說,重寫一個接受不同參數的方法,特別是當它接受的參數比基類方法少時,這是一個壞主意。試想一下:

some_drunk.move(field, cp) 

如果some_drunk是一個普通的Drunk,這個工程。但是,如果它是UsualDrunk,它會將cp的值傳遞給dist參數,這可能不是預期的參數。

+0

就是這樣。像這樣在Java中的例子會超載,因爲'UsualDrunk'類將有2個移動的實現取決於你傳遞給它的參數,但在python中是不可能的 – maid450 2011-03-13 09:52:01

+0

那麼這是否意味着python不是100%對象或者所有這些事情都在幕後發生? – station 2011-03-13 09:55:02

+1

對,python支持OOP,但它不是100%面向對象的,引用了維基百科:'Python支持多種編程範例,主要但不限於面向對象,命令式,以及函數式編程風格。' – maid450 2011-03-13 09:59:33