面向对象三大特性:封装、继承、多态
一、封装(encapsulation)
- 隐藏:属性和现实细节,不允许外部直接访问
- 暴露:公开方法,实现对内部信息的操作和访问
- 作用:限制安全的访问和操作,提高数据安全性
- 可进行数据检查,从而有利于保证对象信息的完整性
- 实现隐藏:
- 保护属性:_属性名,内部使用,不推荐外部使用
- 私有属性:__属性名,仅供内部使用,已强制转换为_类名__属性名
# 代码实现隐藏
class Account:
# 普通属性
bank = "BOC"
# 保护属性
_username = "cc"
# 私有属性
__password = "888"
- 实现暴露:
- 提供数据访问功能(getter)
- 使用@property装饰器
- 调用:实例.方法名
# 代码实现暴露
class Account:
# 普通属性
bank = "BOC"
# 保护属性
_username = "cc"
# 私有属性
__password = "888"
def print_userinfo(self):
# self._username = "cb"
print(self.bank)
print(self._username)
print(self.__password)
@property
def password(self):
return self.__password
@password.setter
def password(self, value):
self.__password = value
# return self
二、继承
- 复用父类的公开属性和方法
- 拓展出新的属性和方法
- 语法:
- class 类名(父类列表)
- 无父类则默认父类是object
- python支持多继承
- isinstance(a,b):检查a是否是b的实例对象
- issubclass(a,b):检查a是否是b的子类
三、多态
重写构造方法:
- super().init()
- 父类名.init()
四、导包
- 搜索路径顺序(图例从上往下找包,一旦找到就停止查找)
- 包含输入脚本的目录(如果未指定文件,则为当前目录)
- PYTHONPATH(目录名称列表、语法与shell变量相同的PATH)
- 安装的默认路径
五、异常
程序一旦出现异常,程序就会终止运行,后面的代码就不会被执行
- 程序执行过程中出现的未知错误
- 语法和逻辑都是正常的
- 程序业务逻辑不完善引起的程序漏洞(bug)
- 常见的异常类型:
- 除零异常
- 名称异常
- 索引异常
- 属性异常
- 断言异常
- 键异常
- 值异常
# 处理异常
try:
尝试运行代码
except:
如果发生异常····
else:
没有发生异常····
finally:
无论有没有发生异常都会
# 自定义异常
class MyError(Exception):
def __init__(self,value):
self.value = value
def __str__(self):
return repr(self.value)
六、dataclass类型注解
dataclass简介
- 优势
- 可读性强
- 操作灵活
- 轻量
- 应用场景
- 创建对象
- 完美融合平台开发ORM框架
只需要在类上面添加一个装饰器
- field常用参数
- default:字段默认值
- default_factory:定义可以变参数默认值,defaul和default_factory不能同时存在
- init:如果为True(默认为True),该字段包含在生成的__init__方法中
- repr:如果为True(默认为True),该字段包含在生成的__repr__返回的字符串中
- asdict()——转化实例对象为字典格式
七、内置类装饰器
类方法:classmethod
使用@classmethod装饰器,第一个参数为类本身,通常使用cls命名
在类中可以直接使用方法或类变量,无法直接使用实例或方法
- 优势
- 不用实例化,直接调用
- 提升代码的可读性
- 缺点
- 类方法中不能直接调用实例方法、实例变量
静态方法:staticmethod
使用@staticmethod,没有和类本身有关的参数
无法直接使用任何变量类方法,或实例方法、实例变量
八、闭包函数
定义:闭包函数内部中,对外部作用域的变量进行引用
闭包函数无法修改外部函数的局部变量
闭包函数可以保存当前的运行环境
九、装饰器
编写装饰器三步走:
1、定义一个外函数,外函数需要一个形参,接受被装饰的函数对象
2、定义一个内函数,在内涵数内调用传入的函数对象;
3、定义外函数的返回值,固定返回内涵数的函数名,不要加().
- 如果被装饰器有参数,则需要在装饰器的内涵数添加形参,并且在函数调用的时候也添加参数信息
- 如果不能确定被装饰函数的参数个数,则可以使用不定长参数
def calcu_time(func):
def inner(*args, **kwargs):
print("函数开始执行")
start_time = datetime.datetime.now()
print(func(*args, **kwargs))
end_time = datetime.datetime.now()
print(f"函数{func}执行的时间为{end_time - start_time}")
print("函数结束执行")
return inner
@calcu_time
def func02():
print("这是函数func02")
@calcu_time
def func03(n):
rel = 0
for i in range(n):
rel += i
return rel