面向对象进阶

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

  • 继承(简单的面试题)
  • 抽象类(重要)
  • 接口类(主要是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

 

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

原文地址:https://www.cnblogs.com/systemsystem/p/10007476.html