zoukankan      html  css  js  c++  java
  • python面向对象(类的多态,鸭子类型)

    一. 接口类

    接口类不能被实例化

    在python里没有接口类这种数据类型,没有接口类专门的语法
    但是 可以通过继承abc模块实现接口的功能

    from abc import ABCMeta,abstractmethod
    class Payment(metaclass=ABCMeta):  # 接口类
        @abstractmethod
        def pay(self,money):
            pass
    class Wechatpay(Payment):         # 根据接口类的规范编程
        def pay(self,money):
            print('微信支付了%s元'%money)
    p = Wechatpay()
    p.pay(6)

    二. 接口隔离原则

    from abc import ABCMeta,abstractmethod
    class FlyAnimal(metaclass=ABCMeta):
        @abstractmethod
        def fly(self):
            print(11111)
    
    class SwimAnimal(metaclass=ABCMeta):
        @abstractmethod
        def swim(self): pass
    
    class WalkAnimal(metaclass=ABCMeta):
        @abstractmethod
        def walk(self): pass
    
    class Swan(SwimAnimal,WalkAnimal,FlyAnimal):
        #
        def fly(self):pass
        # 游泳
        def swim(self):pass
        #
        def walk(self):pass
    
    class Qq(SwimAnimal,WalkAnimal):
        def swim(self):pass
        #
        def walk(self):pass
    
    class Bird(FlyAnimal,WalkAnimal):
        #
        def fly(self):pass
        #
        def walk(self):pass
    
    Swan()
    接口隔离原则

    三. 抽象类

    抽象类 规范一个类的类
    在python里 抽象类和接口类 没区别

    在java里 有区别
    java的接口规定里面的方法一定不能实现(一句代码也不能写)
    抽象类 单继承


    无论接口类 还是抽象类 其实都是一种面向对象编程的开发规范
    只是在接口类或者抽象类中 去约束继承它的子类必须实现某些方法
    对于java代码来说:如果发生多继承(类似上面接口隔离原则) 那么一定是接口类 且里面的方法都不能实现
    如果在方法里有了实现 那么一定是单继承 的抽象类
    但是对于python来说 就没有这些约束
    因为python没有接口的概念
    对于类的继承 没有多继承的限制
    实际上abc模块是帮我实现抽象类的方法,只是我们用它来模仿接口类的效果了

    在python中,只要metaclass = ABCMeta 定义了抽象方法(@abctractmethod)
    这个类就不能被实例化
    你可以说他是一个抽象类

    四. 多态

    python是自带多态的

    例如:上面的接口隔离原则就是多态

    python崇尚鸭子类型

    如:字符串,列表,元组,都是序列类型,但他们直接没有直接的继承关系

    class List:
        def index(self):
            pass
        def slice(self):
            pass
        def len(self):
            pass
        def append(self):
            pass
    class Tuple:
        def index(self):
            pass
        def slice(self):
            pass
        def len(self):
            pass
    class Str:
        def index(self):
            pass
        def slice(self):
            pass
        def len(self):
            pass
        def split(self):
            pass
    鸭子类型
  • 相关阅读:
    ASP.NET MVC什么时候使用异步Action
    linux 下查看机器是cpu是几核的
    Linux--U盘安装Ubuntu12.04[转]
    再谈IE的浏览器模式和文档模式[转]
    Ubuntu 12.04.1 mysql从5.5升级到5.6
    在Linux上挂载Windows共享文件夹,如何开机自动挂载(mount)
    JConsole监控远程Tomcat服务器
    ubuntu iptables设置【转】
    oneinstack一键部署linux生产环境那点事(ubuntu)
    linux下jdk_tomcat+mysql配置那点事
  • 原文地址:https://www.cnblogs.com/zhuzhaoyang/p/8544567.html
Copyright © 2011-2022 走看看