zoukankan      html  css  js  c++  java
  • python学习19类5之多态与鸭子模型

    ''''''
    '''
    一、多态
    1.Python中多态是指一类事物有多种形态。
    '''

    class Animal:
    def run(self):
    raise AttributeError('子类必须实现这个方法') #抛出异常


    class People(Animal):
    def run(self):
    print('人正在走')

    class Pig(Animal):
    def run(self):
    print('pig is walking')


    class Dog(Animal):
    def run(self):
    print('dog is running')

    peo1=People()
    pig1=Pig()
    d1=Dog()

    peo1.run()
    pig1.run()
    d1.run()
    '''
    多态,可以这样理解,不同的对象都可以响应同一个方法,但执行结果各不相同
    2.多态使用场景:(1)统一管理 (2)方法返回同一父类的不同子类对象 (3)方法参数接收同一父类的不同子类对象
    3.多态实现:(1)不同子类继承同一父类,重写要执行的方法,保证执行结果各不相同
    (2)采用鸭子模型的思想,为任意一个类植入需要的方法也可以实现
    '''
    #下面这个例子更加能让我们了解多态的本质

    class Triangle:
    def __init__(self, width, height):
    self.width = width
    self.height = height

    def getArea(self):
    area = self.width * self.height / 2
    return area


    class Square:
    def __init__(self, size):
    self.size = size

    def getArea(self): # 同一个方法在不同的类中最终呈现出不同的效果,即为多态
    area = self.size * self.size
    return area


    a = Triangle(5, 5)
    print(a.getArea())
    b = Square(5)
    print(b.getArea())

    '''
    二、鸭子模型:只要一个东西看起来像鸭子,他就是鸭子
    1.在鸭子模型中,关注的不是对象的类型本身,而是它是如何使用的。

    例如,在不使用鸭子模型的语言中,我们可以编写一个函数,它接受一个类型为"鸭子"的对象,并调用它的"走"和"叫"方法。
    在使用鸭子模型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的"走"和"叫"方法。
    如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的"走"和"叫"方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名。
    '''
    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')
    #可以很明显的看出,Person类拥有跟Duck类一样的方法,这时我们可以写一个函数,这个函数接受任何这种类似的类(有相同的方法的类),并且可以调用他们相同的方法
    def fc(obj): #object类是Python中所有类的父类
    obj.walk()
    peo2=Person()
    fc(peo2) #这时调用这个函数,就可以调用传入类的方法
    '''

    当有一个函数调用Duck类,并利用到了两个方法walk()和swim()。
    我们传入Person类也一样可以运行,函数并不会检查对象的类型是不是Duck,只要他拥有walk()和swim()方法,就可以正确的被调用。
    若传入的类没有要调用的方法,会报错,告诉你参数没有这个属性或方法
    '''
    '''
    2.使用场景:(1)统一管理
    (2)方法返回一个类似该类的对象
    (3)方法接收一个类似该类的对象
    '''
  • 相关阅读:
    关于oralce字符集问题(复制别人的,纯属自己学习)
    Linux下oracle11gR2系统安装到数据库建立配置及最后oracle的dmp文件导入一站式操作记录
    Linux下部署ASP.NET服务连接oracle遇到的问题记录
    前端金钱分转元,元转分精度问题解决
    vue-element的form表单显示图片
    vue页面刷新技巧--(v-if指令)以及vue动态设置css属性
    vue后端获取的数据无法进行双向数据绑定
    Vue实现勾选框全选和局部选择功能
    VUE/jQuery生成二维码扫描跳转地址
    uni-app之数据状态改动后页面不刷新踩坑
  • 原文地址:https://www.cnblogs.com/wsxcode/p/12444934.html
Copyright © 2011-2022 走看看