2011-08-12 57 views
1

在下面的代碼我想實現繼承和多態特性,我的問題是obj1.hello3("1param","2param") obj1.hello3("11param")是這些語句不正確會是什麼做的正確的方式這傳承與多態特性

#!/usr/bin/python 

    class test1: 
    c,d = "" 
    def __init__(self,n): 
     self.name = n 
     print self.name+"==In a" 
    def hello1(self): 
     print "Hello1" 
    def hello3(self,a,b): 
     #print "Hello3 2 param"+str(a)+str(b) 
     #print "ab"+str(self.a)+str(self.b)+"Hello1" 
     print "Hello3 2 param" 

    def hello3(self,a): 
     #print "a"+str(self.a)+"Hello1" 
     print "Hello3 1 param"+str(a) 

    class test2(test1): 
    def __init__(self,b): 
     test1.__init__(self, "new") 
     self.newname = b 
     print self.newname+"==In b" 
    def hello2(self): 
     print "Hello2" 

    obj= test1("aaaa") 
    obj1=test2("bbbb") 
    obj1.hello1() 
    obj1.hello2() 
    obj1.hello3("1param","2param") 
    obj1.hello3("11param") 
+0

python中不支持方法重載嗎? – Rajeev

回答

5

你試圖實現方法重載而不是繼承和多態。

Python不支持以C++,Java,C#等方式進行重載。相反,爲了在Python中實現你想要的,你需要使用可選的參數。

def hello3(self,a,b=None): 
    if b is None: 
     print "Hello3 1 param", a 
    else: 
     print "Hello3 2 param", a, b 

... 

obj1.hello3("a")#passes None for b param 
obj1.hello3("a", "b") 
1

Python不會有方法超負荷,所以

def hello3(self,a): 
    #print "a"+str(self.a)+"Hello1" 
    print "Hello3 1 param"+str(a) 

只是取代以上定義的hello3方法。還要注意,就C++而言,Python類中的所有方法都是「虛擬的」,所以多態性總是在這裏。

也由行aa.__init__(self, "new")您可能意味着test1.__init__(self, "new")

+0

所以你說的是hello3(「a」)和hello(「a」,「b」)會是錯的嗎? – Rajeev

+0

@Rajeev是的。在Python中閱讀一些關於類和OOP的書籍和文章。在StackOverflow中學習這些一般的東西是一個壞主意。 –

+0

嘿,我找不到任何例子或書籍,以便這個wud是最好的地方問它。 – Rajeev

0

那麼首先你有一個像一些編碼問題: c,d = ""或隨機sel有或aa.__init__(self, "new")

我不知道這是來自快速鍵入還是這是您的實際代碼。在test2 __init__方法中,正確的呼叫是test1.__init__(self, "new")

也作爲編碼風格,你應該用camelcase寫一個大寫字母的類,例如:Test1,MyNewClass

這些調用是正確的,但python不支持以java的方式重載。所以多個def hello3(...應該給你一個duplicate signature

+0

是的,我已經糾正它,快速搭售......是的.. – Rajeev

+0

所以你說那裏的方法重載不支持python ..? – Rajeev

+0

正確 - 沒有java或C++式的重載。你可以通過'def hello(a,b = None)'來做到這一點,然後對'b'做一個測試來根據它的存在來改變行爲。 –

1

您可以使用* args或** kwargs。請參閱examples and explanations

class test1: 
    def __init__(self): 
     print 'init' 
    def hello(self, *args): 
     if len(args) == 0: 
      print 'hello there' 
     elif len(args) == 1: 
      print 'hello there 1:',args[0] 
     elif len(args) == 2: 
      print 'hello there 2:',args[0],args[1] 

class test2: 
    def __init__(self): 
     print 'init' 
    def hello(self, **kwargs): 
     if len(kwargs) == 0: 
      print 'hello there' 
     elif 'a' in kwargs and 'b' not in kwargs: 
      print 'hello there a:', kwargs['a'] 
     elif 'a' in kwargs and 'b' in kwargs: 
      print 'hello there a and b:', kwargs['a'], kwargs['b'] 
+0

非常感謝........................ – Rajeev