【python编程语言-L2】

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

一、封装(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()
    ScreenClip

四、导包

  • 搜索路径顺序(图例从上往下找包,一旦找到就停止查找)
    • 包含输入脚本的目录(如果未指定文件,则为当前目录)
    • 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框架

只需要在类上面添加一个装饰器
Image

  • 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