装饰器【Python】

文章目录

  • 装饰器
        • [为什么这里要用 `@classmethod` 而非普通方法?](#为什么这里要用 @classmethod 而非普通方法?)
        • [外部如何访问 one_by_one ,如何修改?](#外部如何访问 one_by_one ,如何修改?)

装饰器

复制代码
class CameraInterface:
    # 类变量:控制相机是否"逐个初始化"(默认关闭,False 表示批量初始化)
    # 类变量属于整个类,而非实例,所有实例共享该值,可通过类名直接修改(如 CameraInterface.one_by_one = True)
    one_by_one = False

    @classmethod
    def init_cam(cls):
        """
        相机初始化的类方法(核心入口)
        功能:根据配置文件中指定的相机类型(Config.camera_object['camera_type']),
              动态导入对应相机的驱动模块,并调用其初始化方法(init_camera)
              
        @classmethod 装饰器的核心作用:
        1. 定义"类方法",而非普通实例方法或静态方法
        2. 类方法的第一个参数固定为 `cls`(代表当前类本身,类似实例方法的 `self`)
        3. 调用方式灵活:可通过类名调用(推荐,如 CameraInterface.init_cam()),
           也可通过实例调用(如 cam = CameraInterface(); cam.init_cam()),两种方式效果完全一致
        4. 类方法内部可访问/修改类变量(如 cls.one_by_one),但不能直接访问实例变量(需通过实例对象)
        """
        # 获取配置文件中指定的相机类型(字符串类型,如 "py_hk" 表示同时初始化 py 相机和 hk 相机)
        camera_type = Config.camera_object['camera_type']
        
        # 1. 若相机类型包含 "py"(对应 Python 原生相机驱动)
        if 'py' in camera_type:
            # 动态导入 py 相机的驱动模块(延迟导入:仅在需要时才导入,节省内存)
            from camera.py_camera.camera_py import py_camera
            # 调用 py 相机驱动的初始化方法(初始化该类型相机硬件/连接)
            py_camera.init_camera()

        # 2. 若相机类型包含 "hk"(对应海康相机驱动)
        if 'hk' in camera_type:
            # 动态导入海康相机驱动模块
            from camera.hk_camera.camera_hk import hk_camera
            # 初始化海康相机
            hk_camera.init_camera()

        # 3. 若相机类型包含 "dh"(对应大华相机驱动)
        if 'dh' in camera_type:
            # 动态导入大华相机驱动模块(注意:此处仅导入,未调用 init_camera(),可能是遗漏或设计如此)
            from camera.dh_camera.dh_camera_driver import dh_camera

        # 4. 若相机类型包含 "ds_usb"(对应 ds 品牌 USB 相机驱动)
        if 'ds_usb' in camera_type:
            # 动态导入 ds USB 相机驱动模块(仅导入,未初始化)
            from camera.ds_usb_camera.d3_usb_interface import ds_usb_camera

        # 5. 若相机类型包含 "md"(对应 md 品牌相机驱动)
        if 'md' in camera_type:
            # 动态导入 md 相机驱动模块(仅导入,未初始化)
            from camera.md_camera.md_interface import md_camera

        # 6. 若相机类型包含 "hr"(对应 hr 品牌相机驱动)
        if 'hr' in camera_type:
            # 动态导入 hr 相机驱动模块(仅导入,未初始化)
            from camera.hr_camera.hr_interface import hr_camera
为什么这里要用 @classmethod 而非普通方法?
  • 核心需求:init_cam 是「相机初始化的入口函数」,不需要创建 CameraInterface 实例就能调用(本质是 "工具函数",属于整个类的功能,而非单个实例的功能)。

  • 若用普通实例方法(无 @classmethod,参数为 self):必须先创建实例 cam = CameraInterface() 才能调用 cam.init_cam(),完全没必要(实例本身无状态,只是个 "调用载体")。

  • 若用 @staticmethod(静态方法):虽然也能通过类名调用,但无法直接访问类变量(如 one_by_one),后续若需扩展 "根据 one_by_one 控制初始化顺序",静态方法无法实现,而类方法可直接操作 cls.one_by_one

外部如何访问 one_by_one ,如何修改?

通过「类名」直接访问(推荐,最规范),类变量属于类本身,直接用 类名.变量名 访问,无需创建实例,简洁高效:

复制代码
# 1. 先导入 CameraInterface 类(根据实际项目路径调整导入语句)
from your_module import CameraInterface  # 替换 your_module 为 CameraInterface 所在的文件名/模块名

# 2. 访问类变量 one_by_one
print(CameraInterface.one_by_one)  # 输出默认值 False(类变量的初始值)

通过「实例对象」访问(效果相同,适合已有实例的场景)

如果已经创建了 CameraInterface 的实例,也可以通过实例访问(实例会优先查找自身的实例变量,若没有则访问类变量):

复制代码
# 1. 创建实例
cam_instance = CameraInterface()

# 2. 通过实例访问类变量
print(cam_instance.one_by_one)  # 输出 False(本质还是访问类变量,不是实例变量)

外部修改 one_by_one 的 2 种方式(推荐第 1 种)

方式 1:通过「类名」直接修改(推荐,影响所有实例)

修改类变量的核心方式:类名.变量名 = 新值,修改后所有实例(包括修改后创建的实例)都会使用新值(类变量是共享的):

复制代码
from your_module import CameraInterface

# 1. 修改类变量(从默认 False 改为 True)
CameraInterface.one_by_one = True

# 2. 验证修改结果
print(CameraInterface.one_by_one)  # 输出 True(类变量已更新)

# 3. 所有实例都会使用修改后的类变量
cam1 = CameraInterface()
cam2 = CameraInterface()
print(cam1.one_by_one)  # 输出 True
print(cam2.one_by_one)  # 输出 True
相关推荐
Never_Satisfied1 小时前
在JavaScript / 微信小程序中,动态修改页面元素的方法
开发语言·javascript·微信小程序
啃火龙果的兔子1 小时前
Kotlin 修改安装到桌面后的应用图标
开发语言·kotlin·harmonyos
来来走走1 小时前
Android开发(Kotlin) ViewModel基本用法
android·开发语言·kotlin
m0_528489251 小时前
Pycharm修改系统缓存路径(包含config, system, plugins, logs, remote sources等)
ide·python·pycharm·c盘
Franklin1 小时前
AI Coding 基础实践03 - Trae AI在Pycharm中的使用02 - 读取不了项目的文件问题解决
ide·python·pycharm
胖墩会武术1 小时前
【OpenCV图像处理】深度学习:cv2.dnn() —— 图像分类、人脸检测、目标检测
图像处理·pytorch·python·opencv
Caarlossss1 小时前
jdbc学习
java·开发语言·学习·http·tomcat·maven
帮帮志1 小时前
PyCharm 开发工具 不同的模式
ide·python·pycharm
Xiaok10181 小时前
在 Jupyter Notebook 中启动 TensorBoard
人工智能·python·jupyter