zoukankan      html  css  js  c++  java
  • 多态 与 鸭子类型 duck duck duck

    # -->
    
    '''
    
    多态 与 鸭子类型
    
    --> 什么是多态
            对象的多种状态,父类对象的多种 (子类对象) 状态
    
    
    --> 什么是鸭子类型:
            长的像就是
            1.规定有什么属性及什么方法的对象叫鸭子类型
            2.能提供出规定的属性与方法的对象就是鸭子
    
            函数内有.xxx .yyy方法
            传入的对象也必须要有.xxx .yyy才能运行
    
    '''
    
    
    # -- ( 多态 ) -------------------------------------------------------------------------------------------
    
    
    import abc
    class People(metaclass=abc.ABCMeta):
        def __init__(self,name):
            self.name = name
    
        def eat(self):
            print('eat')
        @abc.abstractmethod
        def speak(self):pass
    
    
    class Chinese(People):
        def speak(self):
            print('说中国话')
    
    class England(People):
        def speak(self):
            print('说英国话')
    
    
    if __name__ == '__main__':
    
        # def ask_someone(obj):
        # 多态的体现:功能或是需求,需要父类的对象,可以传入父类对象或任意子类对象
        # 一般都是规定需要父类对象,传入子类对象
        # 有抽象方法的父类不能被实例化 (假设因为被实例化后,就可以调用自己的抽象方法,没有意义)
        def ask_someone(obj):
            print('让%s上台演讲'%obj.name) # 父类提供,子类之间继承
            obj.speak()
            # 父类提供,英国和中国speak内容不同,
            # 调用abc模块装饰父类@abc.abstractmethod子类重写
    
        ch = Chinese('王大锤')
    
        # ch实例化,用了Chinses类,用继承的父类People中的自定义name,传入'王大锤'
        en = England('Tom')
    
        ask_someone(ch)
        # 调用函数ask_someone(obj) 传入ch的实例化 Chinese('王大锤')
        ask_someone(en)
    
        # England 类有.name .speak
        # ask_someone 方法有.name .speak需求
        # 即可直接传入
    
    # -- ( 鸭子类型 ) -------------------------------------------------------------------------------------------
    
    # 长的差不多的类,都具有一样的功能
  • 相关阅读:
    upload.go
    heartbeat.go
    delete.go
    get.go
    handler.go
    uuid.go
    kingpin_parser.go
    disk.go
    logrus_hook.go
    反连接NOT EXISTS子查询中有or 谓词连接条件SQL优化一例
  • 原文地址:https://www.cnblogs.com/max404/p/10753631.html
Copyright © 2011-2022 走看看