继承和多态属性

时间:2011-08-12 07:04:03

标签: python

在下面的代码中我试图实现继承和多态属性,我的问题是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")

4 个答案:

答案 0 :(得分: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 :(得分:1)

Python没有方法重载,所以

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

刚刚替换了hello3方法的上述定义。另请注意,Python类中的所有方法都是“C ++”的“虚拟”,所以多态性总是在这里。

同样按行aa.__init__(self, "new")你可能意味着test1.__init__(self, "new")

答案 2 :(得分: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']

答案 3 :(得分:0)

首先,您有一些编码问题,例如:   c,d = ""或那个随机selaa.__init__(self, "new")

我不知道这是来自快速打字还是这是您的实际代码。在test2 __init__方法中,正确的调用是test1.__init__(self, "new")

同样作为编码风格,您应该使用首字母大写字母来编写类,所以:Test1MyNewClass

调用是正确的,但是python不像java那样支持重载。因此,多个def hello3(...应该为您提供duplicate signature