YOLOv8目标跟踪代码BaseTrack中关于类属性的用法

YOLOv8目标跟踪代码BaseTrack中关于类属性的用法

flyfish

源码是

class BaseTrack:_count = 0def __init__(self):"""Initializes a new track with unique ID and foundational tracking attributes."""self.track_id = 0self.is_activated = Falseself.state = TrackState.Newself.history = OrderedDict()self.features = []self.curr_feature = Noneself.score = 0self.start_frame = 0self.frame_id = 0self.time_since_update = 0self.location = (np.inf, np.inf)@propertydef end_frame(self):"""Return the last frame ID of the track."""return self.frame_id@staticmethoddef next_id():"""Increment and return the global track ID counter."""BaseTrack._count += 1return BaseTrack._countid1 = BaseTrack.next_id()  # id1 == 1
id2 = BaseTrack.next_id()  # id2 == 2
id3 = BaseTrack.next_id()  # id3 == 3print(id1)
print(id2)
print(id3)

_countBaseTrack 类的一个类属性。类属性是类本身的属性,而不是实例属性,它在类的所有实例之间共享。
静态方法 next_id 使用 BaseTrack._count += 1 来递增类属性 _count,并返回新的值。
还有以下方式实现该效果

1. 使用类方法(Class Methods)

class BaseTrack:_count = 0def __init__(self):"""Initializes a new track with unique ID and foundational tracking attributes."""self.track_id = BaseTrack.next_id()@classmethoddef next_id(cls):"""Increment and return the global track ID counter."""cls._count += 1return cls._count# 示例使用
track1 = BaseTrack()
print(track1.track_id)  # 输出 1track2 = BaseTrack()
print(track2.track_id)  # 输出 2

2. 使用单例模式(Singleton Pattern)

class SingletonBaseTrack:_instance = None_count = 0def __new__(cls, *args, **kwargs):if cls._instance is None:cls._instance = super(SingletonBaseTrack, cls).__new__(cls)return cls._instancedef __init__(self):"""Initializes a new track with unique ID and foundational tracking attributes."""self.track_id = self.next_id()def next_id(self):SingletonBaseTrack._count += 1return SingletonBaseTrack._count# 示例使用
track1 = SingletonBaseTrack()
print(track1.track_id)  # 输出 1track2 = SingletonBaseTrack()
print(track2.track_id)  # 输出 2

3. 使用模块级别的变量

两个不同的文件之间的共享

# global_counter.py
_count = 0def next_id():global _count_count += 1return _count# main.py
from global_counter import next_idclass BaseTrack:def __init__(self):"""Initializes a new track with unique ID and foundational tracking attributes."""self.track_id = next_id()# 示例使用
track1 = BaseTrack()
print(track1.track_id)  # 输出 1track2 = BaseTrack()
print(track2.track_id)  # 输出 2

4. 使用装饰器模式

def with_counter(cls):cls._count = 0original_init = cls.__init__def new_init(self, *args, **kwargs):original_init(self, *args, **kwargs)self.track_id = cls.next_id()cls.__init__ = new_init@classmethoddef next_id(cls):cls._count += 1return cls._countcls.next_id = next_idreturn cls@with_counter
class BaseTrack:def __init__(self):"""Initializes a new track with unique ID and foundational tracking attributes."""pass# 示例使用
track1 = BaseTrack()
print(track1.track_id)  # 输出 1track2 = BaseTrack()
print(track2.track_id)  # 输出 2

5. 使用类的内部类

可以在类内部定义一个共享状态的类,这样可以在所有实例中共享该内部类的属性。

class BaseTrack:class SharedState:_count = 0@classmethoddef next_id(cls):cls._count += 1return cls._countdef __init__(self):"""Initializes a new track with unique ID and foundational tracking attributes."""self.track_id = BaseTrack.SharedState.next_id()# 示例使用
track1 = BaseTrack()
print(track1.track_id)  # 输出 1track2 = BaseTrack()
print(track2.track_id)  # 输出 2

6. 使用类工厂函数

#类工厂函数可以生成具有共享状态的类。

def create_base_track_class():_count = 0class BaseTrack:@staticmethoddef next_id():nonlocal _count_count += 1return _countdef __init__(self):"""Initializes a new track with unique ID and foundational tracking attributes."""self.track_id = BaseTrack.next_id()return BaseTrackBaseTrack = create_base_track_class()# 示例使用
track1 = BaseTrack()
print(track1.track_id)  # 输出 1track2 = BaseTrack()
print(track2.track_id)  # 输出 2

7. 使用闭包(Closure)

通过闭包可以创建带有共享状态的工厂函数。

def base_track_factory():_count = 0class BaseTrack:def __init__(self):nonlocal _count_count += 1self.track_id = _countreturn BaseTrackBaseTrack = base_track_factory()# 示例使用
track1 = BaseTrack()
print(track1.track_id)  # 输出 1track2 = BaseTrack()
print(track2.track_id)  # 输出 2

可以根据需要选择,对比着看 ,类属性和类方法是最直接,对于更复杂的需求再选其他。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/30993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多组学双疾病串扰怎么做?PAN-AD九个机器学习+MR+单细胞,工作量不少

说在前面 “串扰”这个名词听起来高级了一个level,其实就是MR-通路的双疾病联合分析。虽然是筛选标志物的思路,但是工作量不小,作者还收集了13个不同AD自身免疫疾病数据集用于验证自己的机器学习模型,分析就是一些常规的WGCNA、P…

SpringBoot集成logback初始化源码解析(部分)

一.SpringBoot配置扩展点 SpringBoot日志模块使用监听的方式进行初始化,在SpringBoot项目启动后,会通知日志监听器 在日志监听器中ApplicationStartingEvent事件用来确定到底使用哪个日志系统,logback log4j等 在日志监听器中ApplicationEn…

PTA - 编写函数计算薪资

某公司销售员底薪为5000,销售业绩与利润提成的关系如下表所示(计量单位:元) 编写函数,计算员工月薪。 函数接口定义: salary(sales) 其中 参数 sales表示员工的月销售业绩。 裁判测试程序样例&#xff…

管理咨询公司的五个招聘秘密

在管理咨询中,人是业务;客户支付数百万美元,要求管理顾问确认问题,并推荐解决方案。由于收入和合规性受到威胁,招聘错误的成本可能非常昂贵,一些公司更倾向于谨慎而不是效率。然而,在当今竞争激…

Java23种设计模式(五)

1、MVC 模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。 Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。…

第三期【Demo教程】教你使用SeaTunnel把数据从MySQL导到Hive

随着数据技术的快速发展,了解并掌握各种工具和技术变得尤为重要。为此,我们准备在Apache SeaTunnel社区发起如何使用连接器的Demo演示计划,邀请所有热爱数据同步技术的同学分享他们的知识和实操经验! 我们第三期主题是:如何使用Se…

OOP双人决斗(多重继承)

题目描述 写一个Node2D基类,属性有位置location(string) 一个Body子类继承自Node2D,属性当前生命值health(int),防御力defense(int) 一个Weapon子类也继承自Node2D,属性有武器名w…

Python MongoDB 基本操作

本文内容主要为使用Python 对Mongodb数据库的一些基本操作整理。 目录 安装类库 操作实例 引用类库 连接服务器 连接数据库 添加文档 添加单条 批量添加 查询文档 查询所有文档 查询部分文档 使用id查询 统计查询 排序 分页查询 更新文档 update_one方法 upd…

【Linux工具】yum软件包管理器与Vim编辑器的高效运用

目录 Linux 软件包管理器 YUM 什么是软件包 安装工具 rzsz 及注意事项 查看软件包 安装和卸载软件 安装软件 卸载软件 Linux 开发工具 编辑器 - Vim 使用 ​编辑 Vim 与 Vi 的区别 Vim 的基本概念 三种模式 Vim 的基本操作 操作尝试: Vim 命令集解释…

根据滚珠丝杆规格适配丝杆支撑座!

丝杆支撑座是机械设备中常见的支撑座装置,支撑着滚珠丝杆,起到稳定和支撑的作用,避免丝杆弯曲变形和震动,从而保证设备的稳定运行。那么,我们应该如何正确选择丝杆支撑座呢? 在选择丝杆支撑座时&#xff0c…

android studio 提示dev/kvm is not found怎么解决

检查你的 CPU 是否支持虚拟化: 在 BIOS/UEFI 设置中启用虚拟化技术(如 Intel VT-x 或 AMD-V)。 BIOS下启动虚拟技术步骤: 1、电脑关机状态下,按电源键开机; 2、点击电源键后,立马点击FnF2组…

MySQL Workbench 远程连接 MySQL Server

修改 MySQL Server 侦听地址 首先,MySQL Server 安装完成后,它的侦听地址是 127.0.0.1:3306。这个地址只能本机访问,远程是访问不了的。为了修改侦听地址,需要修改配置文件。MySQL配置文件的名称是 my.cnf,通常保存在…

【16.0】JavaScript对象

【16.0】JavaScript对象 【一】js对象概念 【特性】js中的对象时无序的属性集合【理解】我们可以把js里的对象想象成py中的字典,具有键值对,其实就是属性和属性值u,对象就是一个容器,里面属性的堆放肯定时无序的【玩法】对象的特…

美学心得(第二百六十三集) 罗国正

美学心得(第二百六十三集) 罗国正 (2024年6月) 徐念慈(1974—1908),江苏常熟市人,是文学家、翻译家、教育家、出版家。二十岁时便精通英、日文字,二十一岁中秀才&#…

opencv 打开图片后,cv::mat存入共享内存的代码,实现消费者与生产者模型。XSI信号量和POSIX 信号量

文章目录 基于 sys 系统信号量(XSI信号量)常用api参考 基于 POSIX 信号量有名信号量常用 api 无名信号量常用 api 参考 实践-基于POSIX有名信号量生产者消费者模型任务说明同步关系互斥关系 设置一个互斥信号量,实现对共享内存的互斥访问设置两个信号量,…

铁路防鸟有哪些措施?铁路专用太阳能雷达驱鸟扇

铁路沿线的电杆、接触网支柱以及硬横梁等结构,因其牢固稳定以及无晃动的特点,成为了鸟儿们心仪的筑巢佳地,众多鸟类选择在此“安营扎寨”。而鸟巢中的树枝、草根和铁丝等杂物,极易引起铁路供电设备跳闸,导致短路停电&a…

微信小程序创建新项目,app.json主动设置配置

"window": {"navigationBarTextStyle": "black","navigationBarBackgroundColor": "#f5f5f5","navigationBarTitleText": "微信"},

【云岚到家】-day04-1-数据同步方案-Canal-MQ

【云岚到家】-day04-1-数据同步方案-Canal-MQ 1 服务搜索1.1 服务搜索技术方案1.1.1 需求分析1.1.2 技术方案1.1.2.1 使用Elasticsearch进行全文检索1.1.2.2 索引同步方案 1.1.3 CanalMQ1.1.3.1 MySQL主从数据同步1.1.3.2 Canal工作流程1.1.3.3 具体实现方案 1.2 MQ技术方案1.2…

【QT】

通信服务端实现 widget.h文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpServer>//服务器类 #include <QMessageBox>//消息 #include <QTcpServer> #include <QList> #include <QTcpSocket> QT_BEGIN_NAMESPAC…

apache poi excel export

apache poi excel export 水一篇 凑个数&#xff08;啊 水文章好羞耻啊&#xff01;请原谅我私密马赛&#xff01;&#xff09; 1 ExcelColumn Data Builder ToString NoArgsConstructor AllArgsConstructor public class ExcelColumn implements Serializable {Serialprivat…