7.18. 多态-鸭子类型

python语言本身就是动态语言,本身支持多态,不需要使用前先定义 元素类型
它不关心元素的类型
它会自动根据传入的参数进行 自动调用它本身的方法

7.18.1. 用代码来理解

多态

#!/usr/bin/env python
# -*- coding:utf8 -*-


class Animal(object):
    def run(self):
        print("动物跑......")


class Dog(Animal):
    def run(self):
        print("狗狗跑.....")


class Car(Animal):
    def run(self):
        print("汽车跑.....")


if __name__ == '__main__':
    f1 = Animal()           # 没有发生多态
    f1.run()

    f2 = Dog()              # 发生多态
    f2.run()

    f3 = Car()              # 发生多态
    f3.run()

鸭子类型代码示例1

#!/usr/bin/env python
#-*- coding:utf8 -*-
class Dog(object):
    def say(self):
        print("a dog")

class Cat(object):
    def say(self):
        print("a cat")

class Duck(object):
    def say(self):
        print("a duck")


# animal_list = [Dog, Cat, Duck]
#
# for animal in animal_list:
#     animal().say()

def yazi(func):
    func.say()

a = Dog()
b = Cat()
yazi(a)
yazi(b)

鸭子类型代码示例2

#!/usr/bin/env python
#-*- coding:utf8 -*-
# auther; 18793
# Date:2019/6/6 14:51
# filename: 鸭子类型2.py
class Animal(object):
    def run(self):
        print("动物跑......")


class Dog(Animal):
    def run(self):
        print("狗狗跑.....")

class Car:
    def run(self):
        print("汽车跑.....")


def go(animal):     #参数是Animal
    animal.run()



hu1 = Animal()
hu2 = Dog()
hu3 = Car()

go(hu1)
go(hu2)
go(hu3)

eg

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/6/14 14:25
# filename: 多态性2.py

# class Canvas:
#     def draw_pric(self, shaps):
#         print("开始绘图".center(100, "-"))
#         shaps.shop(self)

def draw_pric(shaps):
    print("开始绘图".center(100, "-"))
    shaps.shop()


class Rectangle:
    def __init__(self, name):
        self.name = name

    def shop(self):
        print("在{}上绘制矩形".format(self.name))


class Triangle:
    def __init__(self, name):
        self.name = name

    def shop(self):
        print("在{}上绘制三角形".format(self.name))


class Circle:
    def __init__(self, name):
        self.name = name

    def shop(self):
        print("在{}上绘制圆形".format(self.name))

# c = Canvas()
#
# hu = Rectangle()
#
# # 传入Rectangle参数绘制矩形
# c.draw_pric(Rectangle())
#
# # 传入Triangle参数绘制三角形
# c.draw_pric(Triangle())
#
# #传入Circle参数绘制圆形
# c.draw_pric(Circle())


juxing = Rectangle("白纸上")
sanjiaoxing = Rectangle("黑板上")
yuanxing = Rectangle("衣服上")

draw_pric(juxing)
draw_pric(sanjiaoxing)
draw_pric(yuanxing)

输出信息

------------------------------------------------开始绘图------------------------------------------------
在白纸上上绘制矩形
------------------------------------------------开始绘图------------------------------------------------
在黑板上上绘制矩形
------------------------------------------------开始绘图------------------------------------------------
在衣服上上绘制矩形