面向对象--抽象类,多态,封装
一.
接口类,抽象类就是制定一个规范,强制他执行
from abc import ABCMeta,abstractmethod class Payment(metaclass=ABCMeta): # 抽象类(接口类): @abstractmethod def pay(self): pass # 制定了一个规范 class Alipay(Payment): def __init__(self,money): self.money = money def pay(self): print('使用支付宝支付了%s' %self.money) class Jdpay(Payment): def __init__(self, money): self.money = money def pay(self): print('使用京东支付了%s' % self.money) class Wechatpay(Payment): def __init__(self,money): self.money = money def pay(self): print('使用微信支付了%s' % self.money) def pay(obj): obj.pay() w1 = Wechatpay(200) a1 = Alipay(200) j1 = Jdpay(100) pay(a1) # 归一化设计 pay(j1) w1.Wechatpay() #到用的时候会报错,因为已经强制执行def pay()函数的方法
接口提取了一群类共同的函数,可以把接口当做一个函数的集合。
然后让子类去实现接口中的函数
二.多态
# python面向对象的三大特征之一:
# 多态: python处处是多态.
# java :强类型语言
# 这些类 都互称为鸭子. class Str: def index(self): pass class List: def abc(self): pass class Tuple: def rrr(self): pass
三.封装
# 广义的封装: 实例化一个对象,给对象空间封装一些属性.
# 狭义的封装: 私有制.
# 私有成员:私有静态字段,私有方法,私有对象属性
class B: __money = 100000 class A(B): name = 'alex' __age = 1000 def func(self): print(self.__age) print(A.__age) # 对于私有静态字段,类的内部可以访问. print('func....') def func1(self): print(self.__money) print(A.__money) a1 = A() print(a1.name) print(A.name) # print(a1.__age) # 实例化对象不能访问私有静态字段 # print(A.__age) # 类名不能访问私有静态字段
a1.func() 访问类的内部
总结:对于私有静态字段,类的外部不能访问.而类的内部可以访问.
class B: __money = 100000 def __f1(self): print('B') class A(B): name = 'alex' def __func(self): print('func....') def func1(self): self.__func() # 类的内部可以访问 self.__f1() # 类的派生类也不能访问. a1 = A() a1.func1() # 类的内部可以访问 a1.func1() # 类的派生类也不能访问.
面试题
class Parent: def __func(self): print('in Parent func') def __init__(self): self.__func() class Son(Parent): def __func(self): print('in Son func') son1 = Son() 结果:in Parent func
四.补充知识点
MRO-C算法-python多继承原理
class H: def bar(self): print('F.bar') class G(H): def bar(self): print('F.bar') class F(H): def bar(self): print('F.bar') class E(G): def bar(self): print('E.bar') class D(F): def bar(self): print('D.bar') class C(E): def bar(self): print('C.bar') class B(D): def bar(self): print('B.bar') class A(B, C, D): def bar(self): print('A.bar') a = A() print(A.mro())
流程图;
执行过程:
A(B,C,D)
首先找到A继承的三个类的深度继承顺序,放到一个列表中
L[B] = [B,D,F,H] #B往上面的继承顺序
L[C] = [C,E,G,H] #C往上面的继承顺序
L[D] = [D,F,H] #D往上面的继承顺序
第二步:A自己的广度,第一层
L[A] = [B,C,D]
每个列表的第一个元素为头部,从第一个列表的头部开始找,找其他列表中尾部是否含有
这个类名,如果没有,提取出来放到一个列表中,如果有,找下一个列表的头部,循环下去
只要提取来一个,我们就从第一个列表的头部接着重复上面的操作.
1 [B,D,F,H] [C,E,G,H] [D,F,H] [B,C,D]
2 [D,F,H] [C,E,G,H] [D,F,H] [C,D] #提取了头部的B,然后将其他列表头部的B删除,并将B放到list中
3 [D,F,H] [E,G,H] [D,F,H] [D] #因为第一个列表的D在其他列表的尾部存在,所以跳过D,然后找第二个列表的头部C,提取了头部的C,然后将其他列表头部的C删除,并将C放到list中
.......
4 [H] [H] [H] []
list = [A,B,C,D,F,E,G,H,object]