面向对象三大特性:封装、继承、多态
一、封装(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
        


