zoukankan      html  css  js  c++  java
  • python之路 -- 继承接口和多态

    继承

    接口类和抽象类

    什么时候用接口类和抽象类

    • 当几个子类的父类,有相同的功能需要被实现时,就用抽象类
    • 当几个子类有相同的功能,但是实现各不相同的时候,使用接口类

    什么是接口类 (在python里默认是没有的)

    • 约束继承接口类的子类必须实现被abstractmethod装饰的方法
    • 在接口类中不能做实现
    • 接口类不能被实例化

    接口类和抽象类在java里面的区别

    • 接口类支持多继承
    • 抽象类只支持单继承

    抽象类(在python里默认有的)

    • 父类的方法,子类必须实现
    • 抽象类不能被实例化
    • 抽象类的方法,可以被简单实现

    开发原则:

    抽象类最好不要用多继承,而接口类可以

    经典类和新式类(python2.7区分,python3.6只有新式类)

    1. 新式类:广度优先
    2. 经典类:深度优先

    多继承

    模拟支付接口

    from abc import ABCMeta,abstractmethod
    class Payment(metaclass = ABCMeta): # 元类
        @abstractmethod
        def pay(self,moeny):pass   # 接口
    class Applepay(Payment): # class Applepay(object)等于class Applepay: 默认继承object
        def pay(self,money):
            print('apple pay 支付了%s'% money)
    class Alipay(Payment):
        def pay(self,money):
            print('支付宝 支付了%s'% money)
    class Wechatpay(Payment):   # 不调用就报错了
        def fuqian(self, money):
            print('微信 支付了%s' % money)
        def pay(self,moeny):pass
    
    def payment(pay_obj,money): # 伪接口
        pay_obj.pay(money)
    apple1 = Applepay()
    # apple1.pay(200)
    ali1 = Alipay()
    # ali1.pay(200)
    payment(ali1,200)
    wechatpay1 = Wechatpay

    接口隔离

    from abc import ABCMeta,abstractmethod
    class Fly_Animal(metaclass=ABCMeta):
        @abstractmethod
        def fly(self): pass
    class Swim_Animal(metaclass=ABCMeta):
        @abstractmethod
        def swim(self): pass
    class Walk_Animal(metaclass=ABCMeta):
        @abstractmethod
        def walk(self): pass
    class Dog(Swim_Animal,Walk_Animal):
        def swim(self):
            print('dog is swimming')
        def walk(self):
            print('dog is walking')
    class Parrot(Fly_Animal,Swim_Animal):
        pass
    d = Dog()
    # p = Parrot()

    抽象类

    from abc import ABCMeta,abstractmethod
    class Animal(metaclass = ABCMeta):
        @abstractmethod
        def eat(self):
            print('打开粮食的袋子')
            print('放一个吃饭的碗')
            print('把粮食倒在碗里')
    
        @abstractmethod
        def sleep(self):
            pass
    class Dog(Animal):
        def eat(self):
            print('dog is eating')
        def sleep(self):
            print('dog is sleeping')
    

    新式类:广度优先

    class A:
        def test(self):
            print('from A')
    class B(A):pass
        # def test(self):
        #     print('from B')
    class C(A):
        def test(self):
            print('from C')
    class E(B):pass
        # def test(self):
        #     print('from E')
    class F(C):
        def test(self):
            print('from F')
    class D(E,F):pass
    
    D().test()
    
    
    print(D.mro())      # 查看广度优先的优先级

    python2.7中的深度查找和广度查找

    经典类:深度查找

    # python2.7
    # 经典类:深度查找
    class A:
        def test(self):
            print('from A')
    class B(A):pass
        # def test(self):
        #     print('from B')
    class C(A):
        def test(self):
            print('from C')
    class E(B):pass
        # def test(self):
        #     print('from E')
    class F(C):
        def test(self):
            print('from F')
    class D(E,F):pass
    
    D().test()

    新式类:广度查找

    # 新式类:广度查找
    class A(object):    # python2.7中继承object类,就是新式类,不继承就是经典类
        def test(self):
            print('from A')
    class B(A):pass
        # def test(self):
        #     print('from B')
    class C(A):
        def test(self):
            print('from C')
    class E(B):pass
        # def test(self):
        #     print('from E')
    class F(C):
        def test(self):
            print('from F')
    class D(E,F):pass
    
    D().test()
    

    多态

    python 自带多态:

    1. 同一类事物的不同状态
    2. 操作的时候不需要关系这个对象的数据类型,只要用就行了




  • 相关阅读:
    Android 判断字符串是否为空
    Android 7.0以上版本 系统解决拍照的问题 exposed beyond app through ClipData.Item.getUri()
    laravel中的登录页面逻辑
    linux的典型分支:
    laravel模型表建立外键约束的使用:
    laravel中的plicy授权方法:
    laravel中的storePublicly对上传的文件设置上传途径
    GitHub下的文件放到Linux系统下
    laravel注册行为的方法和逻辑
    laravel的日志服务
  • 原文地址:https://www.cnblogs.com/8192bit/p/7366595.html
Copyright © 2011-2022 走看看