python本身支持多态,即参数不用指定数据类型,所有多态在python中没有意义,因为python中多态都是这么写的:
class Foo1:
def f1(self):
pass
class Foo2:
def f1(self):
pass
class Foo3:
def f1(self):
pass
def func(arg):
arg.f1()
obj = Foo1() # obj= Foo2() obj = Foo3()
func(obj)
当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子
class Duck():
def walk(self):
print('I walk like a duck')
def swim(self):
print('i swim like a duck')
class Person():
def walk(self):
print('this one walk like a duck')
def swim(self):
print('this man swim like a duck')
def LikeDuckWalkSwim(ducks):
ducks.walk()
ducks.swim()
duck1 = Duck()
person1 = Person()
LikeDuckWalkSwim(duck1)
LikeDuckWalkSwim(person1)
Python 对实现多态(polymorphism)要求得十分宽松,这意味着我们可以对不同对象调用
同名的操作,甚至不用管这些对象的类型是什么。\
而Java就不支持多态,Java需要指定参数对象类型,传参时arg可以是该指定的对象,也可以是该指定类任何子类的对象,所有在Java中使用就变得有意义了,因为要想传参,必须要继承该指定类或者传该类本身
python的继承与普通类:
class Quote():
def __init__(self, person, words):
self.person = person
self.words = words
def who(self):
return self.person
def says(self):
return self.words + '.'
class QuestionQuote(Quote):
def says(self):
return self.words + '?'
class ExclamationQuote(Quote):
def says(self):
return self.words + '!'
# te 类的后代)什么的没有任何关系:
这样的一个函数可以接受一个任意类型的对象,
并调用它的 “走” 和 “叫” 方法。如果这些需要被调用的方法不存在,
那么将引发一个运行时错误。任何拥有这样的正确的 “走” 和
“叫” 方法的对象都可被函数接受
class Babbling*():
def who(self):
return '*'
def says(self):
return 'Babble'
hunter = Quote('Elmer Fudd', "I'm hunting wabbits")
# print(hunter.who(), 'says:', hunter.says())
hunted1 = QuestionQuote('Bugs Bunny', "What's up, doc")
# print(hunted1.who(), 'says:', hunted1.says())
hunted2 = ExclamationQuote('Daffy Duck', "It's rabbit season")
#book与hunters没有任何关系
* = Babbling*()
def who_says(obj):
print(obj.who(), 'says', obj.says())
who_says(*)
print(hunter.who(), 'says:', hunter.says())
who_says(hunter)
而如果是java:
就必须有继承关系,否则就会报错
duck没有implements Performs:
参考:
https://blog.csdn.net/bobozhengsir/article/details/20625727
《Python语言及其应用》