在下面的代码中我试图实现继承和多态属性,我的问题是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 :(得分: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 = ""
或那个随机sel
或aa.__init__(self, "new")
。
我不知道这是来自快速打字还是这是您的实际代码。在test2 __init__
方法中,正确的调用是test1.__init__(self, "new")
。
同样作为编码风格,您应该使用首字母大写字母来编写类,所以:Test1
,MyNewClass
。
调用是正确的,但是python不像java那样支持重载。因此,多个def hello3(...
应该为您提供duplicate signature