文章目录
- 装饰器
-
-
-
- [为什么这里要用 `@classmethod` 而非普通方法?](#为什么这里要用
@classmethod而非普通方法?) - [外部如何访问 one_by_one ,如何修改?](#外部如何访问 one_by_one ,如何修改?)
- [为什么这里要用 `@classmethod` 而非普通方法?](#为什么这里要用
-
-
装饰器
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