python面向对象类的约束和设计的统一化规范

.封装

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

2.多态

  • 定义:一个事物的多种形态
    • 就想a可以是一个字符串,可以是一个列表等等,不像Java中定义时必须声明变量类型
    • Python默认支持多态

3.鸭子类型

  • Python中你看起来像鸭子,那么你就是鸭子

  • 统一化规范

    • 例子:支付统一使用同一个接口

      # 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)
      

4.约束

  • 让具有同一功能的类拥有同一个基类,在基类中对子类进行提示性约束和强制性约束

    • 提示性约束

      • 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方法,在实例化对象时就会报错.
        

5.super的深入理解

  • # 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类的下一位.
    
posted @ 2019-07-10 15:40  恰蜜小嘴  阅读(267)  评论(0编辑  收藏  举报