面向对象--抽象类,多态,封装

一.

接口类,抽象类就是制定一个规范,强制他执行

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]

 

 



 

posted @ 2018-07-26 19:07  shuai1993  阅读(160)  评论(2编辑  收藏  举报