zoukankan      html  css  js  c++  java
  • Python 面向对象三大特性-多态

    # 鸭子类型

      Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’, Golang也有Duck Type的概念。

    #

      封装可以隐藏实现细节,使得代码模块化;

      继承可以扩展已存在的代码模块(类);

      而多态则是为了实现另一个目的 — 接口重用(一个接口多种实现)!

    # 实现方法

    1、定义函数实现 

    class A(object):
    
        def __init__(self, name):
            self.name = name
    
        def say(self):    # 有 print 方法
            print("I Love: " + self.name)
    
    
    class B(object):
    
        def __init__(self, name):
            self.name = name
    
        def say(self):  # 有 print 方法
            print("I Love Love Love: " + self.name)
    
    
    def func(obj):
        obj.say()   # 多态接口,只要对象有say()方法 就是鸭子类型。
    
    
    if __name__ == '__main__':
        a = A("Python") 
        b = B("Python")
    
        func(a)
        func(b)

    2、定义类实现

    class A(object):
    
        def __init__(self, name):
            self.name = name
    
        def say(self): 
            print("I Love: " + self.name)
    
    
    class B(object):
    
        def __init__(self, name):
            self.name = name
    
        def say(self):
            print("I Love Love Love: " + self.name)
    
    
    class Func(object):
    
        def __init__(self, obj):
            self.obj = obj
    
        def func(self):
            self.obj.say()   # 多态接口,只要对象有say()方法 就是鸭子类型。
    
    
    if __name__ == '__main__':
        a = A("Python")
        b = B("Python")
    
        Func(a).func()
        Func(b).func()

    3、数组实现

    class A(object):
    
        def __init__(self, name):
            self.name = name
    
        def say(self):
            print("I Love: " + self.name)
    
    
    class B(object):
    
        def __init__(self, name):
            self.name = name
    
        def say(self):
            print("I Love Love Love: " + self.name)
    
    
    if __name__ == '__main__':
        a = A("Python")
        b = B("Python")
    
        for obj in [a, b]:
            obj.say()

      

  • 相关阅读:
    NPM 与 left-pad 事件:我们是不是早已忘记该如何好好地编程?
    Groovy split竖杆注意
    使用Flask-Migrate进行管理数据库升级
    Fabric自动部署太方便了
    程序员的复仇:11行代码如何让Node.js社区鸡飞狗跳
    grails 私有库相关设置
    A successful Git branching model
    String to Date 多种格式转换
    C#搭建CEF(CEFGLUE) 环境。
    使用Win PE修改其他硬盘中的系统注册表
  • 原文地址:https://www.cnblogs.com/vincenshen/p/6078078.html
Copyright © 2011-2022 走看看