2011-08-12 9 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メソッドの定義の上に置き換えます。また、PythonクラスのすべてのメソッドはC++の用語では 'virtual'なので、多態性は常にここにあることに注意してください。

また、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")です。

また、コーディングスタイルとして、大文字で始まるキャメルケースでクラスを書く必要があります。Test1MyNewClass

呼び出しは正しいですが、PythonはJavaのように過負荷をサポートしていません。だから、複数のdef hello3(...は、あなたに与える必要がありますduplicate signature

+0

はい、私はそれを修正しました、早く結ぶ......はい.. – Rajeev

+0

だから、オーバーロードはPythonではサポートされていません..? – Rajeev

+0

修正 - JavaまたはC++スタイルのオーバーロードはありません。あなたは '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