zoukankan      html  css  js  c++  java
  • 面向对象进阶

    ---恢复内容开始---

    • 继承(简单的面试题)
    • 抽象类(重要)
    • 接口类(主要是python和java的区别)
    • 多继承(c3算法和__mro__)

    一  继承(简单的面试题) 

    class Base:
        def __init__(self):
            self.func()
        def func(self):
            print('in base')
    class  Son:
        def func(self):
            print('in son')
    s= Son()
    # print(s.func())
    # print(s)
    #按题意思看: 结果是不打印任何东西,因为自己没有调用任何方法.想要打印让下面类继承上面类

    修改后:

    # 继承的面试题
    class Base:
        def __init__(self):
            self.func()
        def func(self):
            print('in base')
    class  Son(Base):
        def func(self):
            super().func()
            print('in son')
    s= Son()
    print(s.func())  
    print(s)
    打印结果:

    in base
    in son
    in base
    in son
    None

    二 抽象类

    # 抽象类:是规范下面子类中某些方法用的,必须要有继承关系
    
    # 具体例子
    from abc import ABCMeta,abstractmethod #(抽象方法)
    class Pyment(metaclass=ABCMeta):  #  metaclass=ABCMeta表示类pyment是一个规范类
        @abstractmethod  # 表示下面一行中的pay方法是一个必须在子类中实现的方法(下面的方法名字必须子类中的一样)
        def pay(self):
            pass  # 可以不用写东西
    class WeChatPay(Pyment):
        def __init__(self,name):
            self.name=name
        def pay(self,money):
            print('%s通过微信消费了%s元'% (self.name,money))
    
    class AliPay(Pyment):
        def __init__(self,name):
            self.name = name
        def pay(self,money):
            # 支付宝提供了一个网络上的联系渠道
            print('%s通过支付宝消费了%s元'%(self.name,money))
    
    class ApplePay(Pyment):
        def __init__(self,name):
            self.name = name
        def pay(self,money):
           print('%s通过苹果支付消费了%s元'%(self.name,money))
    # 归一化设计:也就是把实例化,传参放到一个函数里,
    def pay_func(person,payway,money):
        if payway == 'alipay':
            per = AliPay(person)
        elif payway == 'wechatpay':
            per = WeChatPay(person)
        elif payway == 'ApplePay':
            per = ApplePay(person)
        per.pay(money)
    
    pay_func('alex','alipay',200)  # 从下面直接给函数传参数 然函数去做判断 然后去实例化一个对象
    
    a=Pyment()#  错的.抽象类是不能实例化的  
    # 规定: Pyment
    # 就是一个规范类, 这个类存在的意义不在于实现实际的功能, 而是为了约束所有的子类必须实现pay的方法
    # 抽象类的特点:
    # 必须在类定义的时候指定metaclass = ABCMeta
    # 必须在要约束的方法上方加上@abstractmethod方法

    三 接口类:

     python
    # 抽象类 : 抽象类中的方法可以写一些具体的py代码(规范)
    # 单继承
    # 多继承

    # java
    # 不支持多继承,新的概念 接口 Interface
    # 和抽象类几乎一模一样的功能 :
    # 只定义一个接口名字(基类名),内部定义子类必须实现的方法
    # 接口支持多继承
    # 接口内部的所有方法都不能写具体的代码,只能用pass代替

    # 抽象类 :
    # 单继承的形容,并且在单继承中可以在方法中写python代码
    # 接口类 : 更接近java中的接口的概念
    # python中由于有了抽象类的多继承,不需要接口的概念了
    # 一个基类写出来被子类多继承了 : 接口类
    # 并且在方法中只写pass(你可以选择性的满足)

    四 多继承(c3算法和__mro__)

    例子 :

    # 首先
    
    class A:
        pass
        def func(self):print('A')
    
    class B(A):
        pass
        def func(self):print('B')
    
    class C(A):
        pass
        def func(self):
            print('C')
    
    class D(B):
        pass
        def func(self):
            print('D')
    
    class E(C):
        pass
        def func(self):print('E')
    
    class F(D,E):
        pass
        # def func(self):print('F')
    f= F()
    print(f.func())
    print(F.__mro__)
     # python2 :两种类
    # python3 :只有一种类
        # 新式类 : 默认继承object类 # object 是所有类的父类
            # 为什么可以不写__init__?
            # 所有object中的类都是你自己不写也可以调用的
    # 区别
    # 钻石继承问题/多继承的优先级问题
    # 在python3中 所有的类都是新式类,所有的新式类的继承顺序都遵循C3算法,也叫广度优先算法
    # 可以使用类名.__mro__()这个方法来查看这个继承顺序
    # super 在多继承中执行顺序也遵循C3算法

    例子二 :

    class A:
        def func(self):print('A')
    
    class B(A):
        def func(self):
            super().func()
            print('B')
    
    class C(A):
        def func(self):
            super().func()
            print('C')
    
    class D(B,C):
        def func(self):
            super().func()
            print('D')
    
    b = D()
    print(b.func())

    A
    C
    B
    D
    None

     

    ---恢复内容结束---

  • 相关阅读:
    赴美工作常识(Part 4
    赴美工作常识(Part 3
    50 年前的黑客黑什么?
    孩子王?有孩子气才能为王?
    赴美工作常识(Part 2
    UE4 Keynote 1
    Go Programming Language 3
    Go Programming Language 2
    Go Programming Language
    Lua语法要点2
  • 原文地址:https://www.cnblogs.com/systemsystem/p/10007476.html
Copyright © 2011-2022 走看看