栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python中的“鸭子形态”,浅谈一下

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python中的“鸭子形态”,浅谈一下

一、鸭子形态来源

首先在初接触Python就应该知道的,Python是弱类型编程语言

因此,Python中不支持多态,也用不到多态,多态的概念是应⽤于java和C#这些强类型语⾔中的,但是Python崇尚“鸭子形态”。

那么问题来了,什么是“鸭子形态”呢??

这个概念源自詹姆斯.惠特科姆.莱利的一首诗:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

在Python中的理解为:两个类的实例之间可以没有任何联系,只要两个实例之间的方法一致(要求方法名字和参数必须一致),就可以产生多态。

二、上代码

来一个简单得代码理解Python中的“鸭子形态”

class Pet(object):

    def __init__(self, kind):
        self.kind = kind

    def eatFood(self):
        print(f'我有一只宠物{self.kind},它正在吃东西......')


class Dog(Pet):

    def __init__(self, kind):
        super(Dog, self).__init__(kind)

    def eatFood(self):  # 重写父类
        print('小狗正在啃骨头!!!')


class Cat(Pet):

    def __init__(self, kind):
        super(Cat, self).__init__(kind)

    def eatFood(self):  # 重写父类
        print('猫咪正在吃鱼!!!')


class CShu(Pet):

    def __init__(self, kind):
        super(CShu, self).__init__(kind)

    def eatFood(self):  # 重写父类
        print('仓鼠正在吃杂粮!!!')


class Master(object):

    def feed(self, pet):
        # 相当于dog.eatFood()、cat.eatFood()、cshu.eatFood()
        pet.eatFood()
        


if __name__ == '__main__':
    dog = Dog('狗狗')  # 创建Dog类的实例
    cat = Cat('猫咪')  # 创建Cat类的实例
    cshu = CShu('仓鼠')  # 创建CShu类的实例

    master = Master()

    # 可以将实例对象当作数据传递给Master类
    master.feed(dog)
    master.feed(cat)
    master.feed(cshu)

代码中Pet为父类,Dog、Cat、CShu为Pet的子类,继承Pet内所有的属性和方法

变形练习:

  • 生成一个学生类,包含一个zaozixi方法
  • 生成三个子类,并且各自类拥有各自的方法
  • 再生成一个Grade类,类里包含一个randomStu方法,这个方法的作用:随机产生一个学生带领同学们上早自习,并返回随机结果(简单来说:随机结果为传参的类)
  • 主函数里
    • 创建Grade实例,调用其randomStu方法
    • 判断Grade类里,随机返回的结果的类型是否是某一个子类类型,如果是,调用相应的方法

上代码:

import random


class Student(object):

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


    def zaozixi(self):
        print(f'今天带领上早自习的同学为:{self.name}')


class CStudent(Student):

    def english(self):
        print(f'{self.name}同学正在带领其他同学朗读古诗文......')


class MStudent(Student):

    def sing(self):
        print(f'{self.name}同学正在带领其他同学练声......')


class ZStudent(Student):

    def run(self):
        print(f'{self.name}同学正在带领其他同学跑步......')


class Grade(object):

    def randomStu(self):
        stu_list = [CStudent('陈哲'), MStudent('马启月'), ZStudent('郑佳雯')]
        return random.choice(stu_list)


if __name__ == '__main__':
    grade = Grade()
    student = grade.randomStu()
    student.zaozixi()

    if isinstance(student, CStudent):
        student.english()
    elif isinstance(student, MStudent):
        student.sing()
    else:
        student.run()

输出结果为:(每次都是随机的)

今天带领上早自习的同学为:马启月
马启月同学正在带领其他同学练声......


写的不好请谅解!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/849894.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号