面向对象三大特性之封装与多态

时间:2019-07-10 15:18:10   收藏:0   阅读:81

面向对象三大特性:继承,封装,多态

类的约束

# xx科技有限公司. 李业.提前入职.薪资 4000.

# class QQpay:
#
#     def pay(self,money):
#         print(f'利用qq支付了{money}')
#
#
# class Alipay:
#
#     def pay(self,money):
#         print(f'利用支付宝支付了{money}')
#
#
# # 支付功能 规划一下
#
# obj1 = QQpay()
# obj1.pay(100)
#
# obj2 = Alipay()
# obj2.pay(200)

# 版本2: 统一接口,非常好,调离此部分,重新开发一个新的项目.

# class QQpay:
#
#     def pay(self, money):
#         print(f'利用qq支付了{money}')
#
#
# class Alipay:
#
#     def pay(self, money):
#         print(f'利用支付宝支付了{money}')


# 支付功能 规划一下

# def pay(obj,money):  # 归一化设计
#     obj.pay(money)
#
# obj1 = QQpay()
# obj2 = Alipay()
#
# pay(obj1,100)
# pay(obj2,200)


# 第三版找人,找了一个野生程序员. 5000

# class QQpay:
#
#     def pay(self, money):
#         print(f'利用qq支付了{money}')
#
#
# class Alipay:
#
#     def pay(self, money):
#         print(f'利用支付宝支付了{money}')
#
#
# class Wechatpay:
#     def fuqian(self,money):
#         print(f'利用微信支付了{money}')
#
#
# # 支付功能 规划一下
#
# def pay(obj,money):  # 归一化设计
#     obj.pay(money)
#
# obj1 = QQpay()
# obj2 = Alipay()
#
# pay(obj1,100)
# pay(obj2,200)
#
# obj3 = Wechatpay()
# obj3.fuqian(300)

# 第四版: 按照之前的代码,改进.
#
# class QQpay:
#
#     def pay(self, money):
#         print(f'利用qq支付了{money}')
#
#
# class Alipay:
#
#     def pay(self, money):
#         print(f'利用支付宝支付了{money}')
#
#
# class Wechatpay:
#     def pay(self,money):
#         print(f'利用微信支付了{money}')
#
#
# # 支付功能 规划一下
#
# def pay(obj,money):  # 归一化设计
#     obj.pay(money)
#
# obj3 = Wechatpay()
# pay(obj3, 300)

# 在上面的情况下(在一些重要的逻辑,与用户数据相关等核心部分),我们要建立一种约束,避免发生此类错误.
# 类的约束有两种解决方式:
# 1. 在父类建立一种约束.
# 2. 模拟抽象类(指定一种规范)的概念,建立一种约束.


# 第一种解决方式:
#
# class Payment:
#
#     def pay(self,money):  # 约定俗称定义一种规范,子类要定义pay方法.
#         raise Exception('子类必须定义此方法')
#
#
# class QQpay(Payment):
#
#     def pay(self, money):
#         print(f'利用qq支付了{money}')
#
#
# class Alipay(Payment):
#
#     def pay(self, money):
#         print(f'利用支付宝支付了{money}')
#
# # class Wechatpay(Payment):
# #     def pay(self,money):
# #         print(f'利用微信支付了{money}')
#
# class Wechatpay(Payment):
#     def fuqian(self,money):
#         print(f'利用微信支付了{money}')
#
# # 支付功能 规划一下
#
# def pay(obj,money,choice):  # 归一化设计

#     obj.pay(money)
#
# choice = input('qq,weixin,zhifubao')
# obj3 = Wechatpay()
# pay(obj3,300)
# obj3.fuqian(300)
# # print(11)

# raise TypeError('代码格式错误')
# print(222)

# 第一种约束: 在父类定义一个pay方法,主动抛出异常,如果子类没有定义pay方法,并且沿用了父类的pay方法
# 即会报错.   python推荐的一种约束方式.


# 第二种:
# from abc import ABCMeta,abstractmethod
#
# class Payment(metaclass=ABCMeta):
#             # 抽象类 接口类  规范和约束  metaclass指定的是一个元类
#     @abstractmethod
#     def pay(self, money):
#         pass  # 抽象方法
#
#
# class QQpay(Payment):
#
#     def pay(self, money):
#         print(f'利用qq支付了{money}')
#
#
# class Alipay(Payment):
#
#     def pay(self, money):
#         print(f'利用支付宝支付了{money}')
#
# # class Wechatpay(Payment):
# #     def pay(self,money):
# #         print(f'利用微信支付了{money}')
#
# class Wechatpay(Payment):
#     def fuqian(self,money):
#         print(f'利用微信支付了{money}')
#
#     # def pay(self,money):
#     #     pass
#
#
# obj3 = Wechatpay()

# 利用抽象类的概念: 基类如上设置,子类如果没有定义pay方法,在实例化对象时就会报错.

super的深入了解

super()

#
# class A:
#     def f1(self):
#         print('in A f1')
#
#     def f2(self):
#         print('in A f2')
#
#
# class Foo(A):
#     def f1(self):
#         # super().f2()
#         super(Foo, self).f2()
#         print('in A Foo')
#
#
# obj = Foo()
# obj.f1()
#


# class A:
#     def f1(self):
#         print('in A')
#
# class Foo(A):
#     def f1(self):
#         super(Foo,self).f1()
#         print('in Foo')  # 2
#
# class Bar(A):
#     def f1(self):
#         print('in Bar')  # 1
#
# class Info(Foo,Bar):
#
#     def f1(self):
#         super(Info,self).f1()
#         print('in Info f1')  # 3
#
# obj = Info()
# print(Info.mro())  # [Info, Foo, Bar, A]
# obj.f1()

# super() 严格意义并不是执行父类的方法.
# 单继承: super() 肯定是执行父类的方法.
# 多继承: super(S,self) 严格按照self从属于的类的mro的执行顺序,执行 S类的下一位.



class A:
    def f1(self):
        print('in A')

class Foo(A):

    def f1(self):
        super().f1()
        print('in Foo')

class Bar(A):

    def f1(self):  # self = obj
        print('in Bar')

class Info(Foo,Bar):

    def f1(self):  # self = obj
        super(Foo,self).f1()
        print('in Info f1')

obj = Info()  # [Info, Foo, Bar, A]
obj.f1()
# 多继承: super(S,self) 严格按照self从属于的类的mro的执行顺序,执行 S类的下一位.

原文:https://www.cnblogs.com/-777/p/11164070.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!