python面向对象类的约束和设计的统一化规范
2024-10-08 20:06:59
.封装
- 定义:将一些东西内容封存到一个地方,你还可以再取出,
- 类设置静态属性,设置一些方法
- 对象可以在其对象空间中封装一些属性
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类的下一位.
最新文章
- Android自定义组件
- tps (事务处理系统)
- 最近360和adsafe软件有冲突
- [LintCode] Word Break
- 【T-SQL系列】临时表、表变量
- Android:什么是Holo?【Translated By KillerLegend】
- [Oracle]Audit(二)--清理Audit数据
- Linux搭建SVN服务器(服务端)
- [C#] 動的にアセンブリをロードする
- GIS软件相关安装(持续更新)
- 前端框架之Vue(10)-全家桶简单使用实例
- 用Handler的post()方法来传递线程中的代码段到主线程中执行
- jQuery调用WCF需要注意的一些问题
- MVC-READ2
- loadrunner12-错误 -26366: 找不到 web_reg_find 的“Text=19728.00”
- Replication--使用备份初始化订阅--请求订阅
- Java-Maven-Runoob:Maven 构建 Java 项目
- Ubuntu下安装部署MongoDB以及设置允许远程连接
- ARM模式下创建Express Route
- 问题009:java当中的关键字有哪些?在Editplus文本编辑软件中是什么颜色的?java当中的标识符有什么要求?Java中注释分为几类?
热门文章
- 201612-2 工资计算 Java
- win10编译tensorflow C++接口
- mqtt+htttp+websocket
- ubuntu18.04国内软件源
- 封装FTP类
- 吴裕雄--天生自然 PYTHON3开发学习:网络编程
- 树莓派切换到root用户
- [原]C++新标准之std::chrono::time_point
- grep -v|grep -F
- ubuntu linux下解决“no java virtual machine was found after searching the following locations:”的方法