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

mac2022-06-30  26

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

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

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

类设置静态属性, 设置一些方法, 对象.对象可以在其对象空间中封装一些属性.

多态: 一个事物产生多种形态. 水: 气态液态固态.,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类的下一位. posted on 2019-07-10 15:10  七橼77 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/-777/p/11164070.html

相关资源:C# 面向对象三大特性:封装、继承、多态
最新回复(0)