python面向对象之多态鸭子类型与Java的比较

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 BabblingBrook():
    def who(self):
        return 'Brook'

    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没有任何关系
brook = BabblingBrook()


def who_says(obj):
    print(obj.who(), 'says', obj.says())


who_says(brook)
print(hunter.who(), 'says:', hunter.says())
who_says(hunter)

而如果是java:
就必须有继承关系,否则就会报错
在这里插入图片描述
duck没有implements Performs:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
参考:
https://blog.csdn.net/bobozhengsir/article/details/20625727
《Python语言及其应用》

发布了548 篇原创文章 · 获赞 135 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qq_41228218/article/details/104073970
今日推荐