Python全栈(第一期)Day25

今日主要内容:
继承的复习
接口类初识
接口类的多继承
抽象类
多态的简单介绍

一,继承的复习总结

# 继承 : 什么是什么的关系
# 单继承 *****
    # 先抽象再继承,几个类之间的相同代码抽象出来,成为父类
    # 子类自己没有的名字,就可以使用父类的方法和属性
    # 如果子类自己有,一定是先用自己的
    # 在类中使用self的时候,一定要看清楚self指向谁
# 多继承 ***
    # 新式类和经典类:
        # 多继承寻找名字的顺序 : 新式类广度优先,经典类深度优先
        # 新式类中 有一个类名.mro方法,查看广度优先的继承顺序
        # python3中 有一个super方法,根据广度优先的继承顺序查找上一个类

二,接口类初识

# java : 面向对象编程,都是用来写大项目
# 设计模式   —— 接口
# 接口类 : python原生不支持
# 抽象类 : python原生支持的

from abc import abstractmethod, ABCMeta

class Payment(metaclass=ABCMeta):  # 元类,默认的元类是type
    @abstractmethod  #规范类:要求子类中必须有pay方法。
    def pay(self, money):
        pass   # 没有实现这个方法



# 作用就是:规范。(上面的例子)接口类或者抽象类都可以
# 接口类 支持多继承,接口类中的所有的方法都必须不能实现(必须是pass) —— java
# 抽象类 不支持多继承,抽象类中方法可以有一些代码的实现 —— java




class Wechat(Payment):
    def pay(self, money):
        print('已经用微信支付了%s元' % money)

class Alipay(Payment):
    def pay(self, money):
        print('已经用支付宝支付了%s元' % money)





class Applepay(Payment):
    def pay(self, money):
        print('已经用applepay支付了%s元' % money)


def pay(pay_obj, money):  # 统一支付入口
    pay_obj.pay(money)



# 方法一
# wechat = Wechat()
# wechat.pay(100)





# 方法二
app = Applepay()
pay(app, 100)

输出结果:
已经用applepay支付了100元

三,接口类的多继承

# 接口的多继承:
# tiger   走路 游泳
# swan    走路 游泳 飞
# oldying 走路      飞
from abc import abstractmethod, ABCMeta
class Swim_Animal(metaclass=ABCMeta):
    @abstractmethod
    def swim(self):
        pass

class Walk_Animal(metaclass=ABCMeta):
    @abstractmethod
    def walk(self):
        pass

class Fly_Animal(metaclass=ABCMeta):
    @abstractmethod
    def fly(self):
        pass

class Tiger(Walk_Animal, Swim_Animal):
    def walk(self):
        pass
    def swim(self):
        pass

class OldYing(Fly_Animal, Walk_Animal):
    pass

class Swan(Swim_Animal, Walk_Animal, Fly_Animal):
    pass

# 接口类  刚好满足接口隔离原则 面向对象开发的思想 规范


'''
接口隔离原则:
使用多个专门的接口,而不使用单一的总接口。
即客户端不应该依赖那些不需要的接口。
'''

四,抽象类

'''

抽象类是为了解决单继承问题而出现!

'''
import abc  #利用abc模块实现抽象类

class All_file(metaclass=abc.ABCMeta):
    all_type = 'file'
    @abc.abstractmethod  #定义抽象方法,无需实现功能
    def read(self):
        '子类必须定义读功能'
        with open('filaname') as f:
            pass



    @abc.abstractmethod  # 定义抽象方法,无需实现功能
    def write(self):
        '子类必须定义写功能'
        pass

class Txt(All_file):  #子类继承抽象类,但是必须定义read和write方法
    def read(self):
        print('文本数据的读取方法')
    def write(self):
        print('文本数据的读取方法')

class Sata(All_file):  #子类继承抽象类,但是必须定义read和write方法
    def read(self):
        print('硬盘数据的读取方法')
    def write(self):
        print('硬盘数据的读取方法')

class Process(All_file):  #子类继承抽象类,但是必须定义read和write方法
    def read(self):
        print('进程数据的读取方法')

    def write(self):
        print('进程数据的读取方法')

wenbenwenjian = Txt()

yingpanwenjian = Sata()

jinchengwenjian = Process()

#这样大家都是被归一化了,也就是一切皆文件的思想
wenbenwenjian.read()
yingpanwenjian.write()
jinchengwenjian.read()

print(wenbenwenjian.all_type)
print(yingpanwenjian.all_type)
print(jinchengwenjian.all_type)


# 抽象类 : 规范
# 一般情况下:单继承-->能实现的功能都是一样的,所以在父类中可以有一些简单的基础实现
# 多继承的情况 由于功能比较复杂,所以不容易抽象出相同的功能的具体实现写在父类中


# 抽象类还是接口类 : 面向对象的开发规范 所有的接口类和抽象类都不能实例化
# java :
# java里的所有类的继承都是单继承,所以抽象类完美的解决了单继承需求中的规范问题
# 但对于多继承的需求,由于java本身语法的不支持,所以创建了 接口 Interface这个概念来解决多继承的规范问题

# python :
# python中没有接口类  :
    # python中自带多继承 所以我们直接用class来实现了接口类
# python中支持抽象类  : 一般情况下 单继承  不能实例化
    # 且可以实现python代码

输出结果:
文本数据的读取方法
硬盘数据的读取方法
进程数据的读取方法
file
file
file

五,多态

# 多态 python 天生支持多态

'''
问题的提出:
    下面的这个例子中,如果我们给pay_obj 传输Alipay,那么就不能再传输Applepay!

多态:
一类事物有多种形态,动物有多态:人猪狗


那么什么叫多态性?
从下面这个例子来说,同样是执行pay方法,但是却实现不同的效果!

'''
# class Alipay():
#     def pay(self,money):
#         print('已经用支付宝支付了%s元' % money)
#
# class Applepay():
#     def pay(self,money):
#         print('已经用applepay支付了%s元' % money)
#
# def pay(pay_obj,money):  # 统一支付入口  又叫归一化设计
#     pay_obj.pay(money)
#
# pay()

# 什么是多态?
# python 是动态强类型的语言


# 补充一个知识:鸭子类型
# list tuple
# 不崇尚根据继承所得来的相似
# 我只是自己实现我自己的代码就可以了。
# 如果两个类刚好相似,并不产生父类的子类的兄弟关系,而是鸭子类型
# list tuple 这种相似,是自己写代码的时候约束的,而不是通过父类约束的(全凭自觉)
# 优点 : 松耦合 每个相似的类之间都没有影响
# 缺点 : 太随意了,只能靠自觉!!!





# # 强类型语言     多态
# # python 语言    鸭子类型


# 接口类和抽象类 在python当中的应用点并不是非常必要
# python 提倡鸭子类型,并不提倡用继承去规范。

六,封装

# 广义上面向对象的封装 :代码的保护,面向对象的思想本身就是一种封装
# 只让自己的对象能调用自己类中的方法



# 狭义上的封装 —— 面向对象的三大特性之一
# 属性 和 方法都藏起来 不让你看见


class Person:
    __key = 123  # 私有静态属性
    def __init__(self, name, passwd):
        self.name = name
        self.__passwd = passwd   # 私有属性(在变量前面加双下划綫)

    def get_pwd(self):
        return self.__passwd     # 只要在类的内部使用私有属性,就会自动的带上_类名
                                 # 在外部没法设置新的私有属性。


    def __get_pwd(self):           # 私有方法
        return self.__passwd



    def login(self):             # 正常的方法调用私有的方法
        return self.__get_pwd()

alex = Person('alex', 'alex3714')

#print(alex.__passwd)             # 程序会报错


print(alex._Person__passwd)      # 方法一: _类名__属性名  可以调到私有属性

print(alex.get_pwd())            # 方法二:

print(alex.__dict__)             # 方法三:可以调到私有属性的


print(alex.login())              # 方法四:正常的方法!

print('''
上面的方法中,只有方法四是最正规的方法!其他的都是投机倒把!
因为:
方法一到方法三:都是从外部调用私有属性!
但是方法四:是从内部调用私有属性!
''')


alex.__high = 187
print(alex.__high)               # 可以打印-->设置私有属性失败





# 所有的私有 都是在变量的左边加上双下划綫
    # 对象的私有属性
    # 类中的私有方法
    # 类中的静态私有属性

# 所有的私有的 都不能在类的外部使用

输出结果:
alex3714
alex3714
{‘name’: ‘alex’, ‘_Person__passwd’: ‘alex3714’}
alex3714
上面的方法中,只有方法四是最正规的方法!其他的都是投机倒把!
因为:
方法一到方法三:都是从外部调用私有属性!
但是方法四:是从内部调用私有属性!
187

猜你喜欢

转载自blog.csdn.net/qq_42615032/article/details/85244355
今日推荐