当前位置: 首页 > news >正文

类的多态的理解和应用场景

课上的理解

用例子说明:

class People(object):  # 先定义一个基类
    def talk(self):  # 基类的talk方法,我们不希望被调用,写一个会抛出错误的代码
        "如果基类的这个方法被调用,就抛出一个错误"
        raise NotImplementedError("Subclass must implement abstract method")
class Chinese(People):  # 这个是子类
    def talk(self):  # 重构talk方法
        print("你好,世界")
class American(People):
    def talk(self):
        print("Hello World")
# 如果调用了基类的方法,会根据raise里定义的,抛出一个错误。去掉下面的注释测试一下
#p1 = People()  # 实例化一个基类
#p1.talk()  # 调用基类的talk方法
# 实例化2个对象
c1 = Chinese()
a1 = American()
# 通过子类调用自己的方法当然没问题。要用多态就是要使用统一的接口来实现这2条命令
c1.talk()
a1.talk()
# 多态是要用父类调用子类
#People.talk(c1)  # 这样是最好的,真正的直接实现多态的方法,但是Python不支持
#People.talk(a1)
# 间接支持多态的方法,定义一个函数作为统一的接口
def People_talk(obj):
    obj.talk()
# 用新定义的接口,调用不同的子类,每次用的都是这个子类里重构的那个方法
People_talk(c1)  # 传入一个c1对象,实际就是执行c1.talk()
People_talk(a1)  # 传入一个a1对象,实际就是执行a1.talk()

上面的例子中,用同一个接口People_talk(),传入不同的对象,调用的是不同的方法。

现在的理解

在学习面相对象之前,调用函数都是这样的:函数名()
现在,类中的函数叫做方法,调用的时候是这样的:对象名.方法名()
同样都是函数,但是现在有了两种调用方式。多态可以将方法的调用方式传化成之前函数的调用方式函数名(对象名) ,这样就统一了接口的调用方式。原来的对象是作为函数名,传化后对象作为函数的参数。

应用场景

同样都是函数,因为放在了类中,导致了调用方式的变化。在类外重新定义一个接口,把调用方式再变回去

class Classes(object):
    def __init__(self,name,teacher):
        self.name = name
        self.teacher = teacher
class Teacher(object):
    def __init__(self,name,classes):
        self.name = name
        self.classes = classes
    def check_student(self,student_obj):
        if self.classes == student_obj.classes:
            print("%s is your student"%teacher_obj.name)
        else:
            print("This is not your student")
class Student(object):
    def __init__(self,name,classes):
        self.name = name
        self.classes = classes
    def get_teacher(self):
        print(self.classes.teacher)
def Student_get_teacher(obj):
    obj.get_teacher()
c1 = Classes("Class1","Jerry")
t1 = Teacher("Jerry","Class1")
s1 = Student("Tom",c1)
s1.get_teacher()
Student_get_teacher(s1)  # 上面的多态,效果和上面那句一样,但是调用方式和下面的一样
t1.check_student(s1)  # 现在两个方法都是将一个对象作为参数调用执行了
key = input("输入1或者其他")  # 根据你的输入,决定func具体是哪个方法
func = Student_get_teacher if key == '1' else t1.check_student
func(s1)  #  无论func是哪个方法,现在都是统一传入一个对象执行了

不用多态也是可以的,不过现在至少多了一个解决问题的途径了。

转载于:https://blog.51cto.com/steed/2046437

相关文章:

  • spring boot start log4j2 开启异步
  • java爬虫HttpURLConnect获取网页源码
  • Oracle 监听器无法启动(TNS-12537,TNS-12560,TNS-00507)
  • 开发微信小程序中SSL协议的申请、证书绑定、TLS 版本处理等
  • 422. 最后一个单词的长度
  • ansible分发密钥
  • JavaWeb-HttpServletResponse对象一
  • JS~模拟表单在新窗口打开,避免广告拦截
  • mysql分表经验总结
  • Lind.DDD.Messaging框架通讯组件介绍
  • 未完成.队列
  • vuex的使用
  • 21、PHP和python/JAVA比,哪个更好学?
  • word 2007每次打开总出现setup error
  • C# WinForm开发系列 - GDI+【转】
  • 《剑指offer》分解让复杂问题更简单
  • 【剑指offer】让抽象问题具体化
  • 【刷算法】从上往下打印二叉树
  • 2017前端实习生面试总结
  • angular2开源库收集
  • Druid 在有赞的实践
  • ECS应用管理最佳实践
  • express + mock 让前后台并行开发
  • js中的正则表达式入门
  • Mybatis初体验
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Wamp集成环境 添加PHP的新版本
  • 服务器之间,相同帐号,实现免密钥登录
  • 一起参Ember.js讨论、问答社区。
  • 转载:[译] 内容加速黑科技趣谈
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​configparser --- 配置文件解析器​
  • !!java web学习笔记(一到五)
  • #define
  • #QT(串口助手-界面)
  • #预处理和函数的对比以及条件编译
  • $$$$GB2312-80区位编码表$$$$
  • $jQuery 重写Alert样式方法
  • (04)odoo视图操作
  • (4.10~4.16)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (独孤九剑)--文件系统
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (利用IDEA+Maven)定制属于自己的jar包
  • (推荐)叮当——中文语音对话机器人
  • (转)Scala的“=”符号简介
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .Net MVC4 上传大文件,并保存表单
  • .NET NPOI导出Excel详解