zoukankan      html  css  js  c++  java
  • 面向对象三大特性之封装与多态

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

    • 封装:将一些东西内容封装到一个地方,你还可以取出来.

    • 类设置静态属性, 设置一些方法,
      对象.对象可以在其对象空间中封装一些属性.
      
    • 多态: 一个事物产生多种形态. 水: 气态液态固态.,python中默认支持多态

      # 多态:
      # python中 定义变量不用规定变量的类型.
      # a = 'alex'
      # a = [1, 2, 3]
      # a = (22, 33)
      # def func(a:int):
      #     print(a)
      # func('fdsa')
      
      # java:
      # int a = 12
      # String b = 'dfsaf'
      '''
      def func(int a):
          print(a)
      
      '''
      
    • ​ 鸭子类型:

      ​ python中: 你看起来像鸭子,那么你就是鸭子.

      # 鸭子类型(面试会问到)
      # python中
      
      
      # class A:
      #
      #     def login(self):
      #         pass
      #
      #     def register(self):
      #         pass
      #
      #
      # class B:
      #
      #     def login(self):
      #         pass
      #
      #     def register(self):
      #         pass
      
      # A,B两个类,没有任何关系,独立两个,但是里面的功能相似,所以python一般会将类似于A,B两个类
      # 里面的相似的功能让其命名相同.
      # 1. A,B虽然无关系,但是很默契的制定了一个规范.让你使用起来更方便.
      '''
      class Str:
          def index():
              pass
          def count():
              pass    
              
              
      class List:
          def index():
              pass
          def count():
              pass 
      '''
      

    类的约束

    # 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类的下一位.
    
  • 相关阅读:
    总结一下vue里一些小技巧
    vue使用过程常见的一些问题
    Vue.js 的几点总结Watchers/router key/render
    Hibernate-3
    Hibernate-2
    Hibernate-1
    百词斩一面9.17
    vivo一面凉经
    中兴技术面被怼面经
    红黑树
  • 原文地址:https://www.cnblogs.com/-777/p/11164070.html
Copyright © 2011-2022 走看看