python中封装多态和约束的代码展示

'''
封装:将一些东西内容封装到一个地方,你还可以取出来。
类设置静态属性,设置一些方法
对象,对象可以在其对象空间中封装一些属性

多态:一个事物产生多种形态:气液固
python默认支持多态
'''
#
# class A:
#     class_name = '23'
#     def __init__(self,name,age):
#
#         self.name = name
#         self.age = age
#
# a1 = A('yz',21)
# print(a1.name)
#
# a2 = A('yyc',24)
# print(a2.age)

#多态:python中定义变量不用规定变量类型
# a = 'yz'
# a = [1,2,3]
# a = (22,23)

#鸭子类型
'''
python,你看起来像鸭子,那么你就是鸭子。

A,B互称为鸭子🦆
'''
# class A:
#
#     def login(self):
#         pass
#
#     def register(self):
#         pass
#
# class B:
#     def login(self):
#         pass
#
#     def register(self):
#         pass
#A,B虽然无关系但是很默契制定了一个规范,让你使用起来很方便。

#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()
        print('in A foo')

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

# 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)
#
# obj2 = Alipay()
# obj1 = QQpay()
# pay(obj1,100)
# pay(obj2,200)

#第三版
# 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)
#
# obj2 = Alipay()
# obj1 = QQpay()
# 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)
#
# obj2 = Alipay()
# obj1 = QQpay()
# pay(obj1,100)
# pay(obj2,200)
#
# obj3 = Wechatpay()
# pay(obj3,300)

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

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

# class Payment:
#     def pay(self,money):#约定俗称定义一种规范,子类要定义pay方法
#         raise Exception('子类必须定义pay方法') #主动抛出异常
#
# 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 fuqian(self,money):
#         print(f'利用微信支付了{money}')
#
# #支付功能
# def pay(obj,money):  #统一规划
#     obj.pay(money)
#
# obj2 = Alipay()
# obj1 = QQpay()
# pay(obj1,100)
# pay(obj2,200)
# # raise Exception('代码格式错误')
# obj3 = Wechatpay()
# obj3.fuqian(400)
# pay(obj3,300)


#第二种:

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 fuqian(self,money):
        print(f'利用微信支付了{money}')

    # def pay(self,money):
    #     pass

# obj2 = Alipay()
# obj1 = QQpay()
# pay(obj1,100)
# pay(obj2,200)
obj3 = Wechatpay()
# pay(obj3,300)
# obj3.fuqian(400)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值