1.单例模式

概念定义:

        单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只能有一个实例,并提供一个全局访问点来获取该实例。这种模式在需要控制资源访问、配置管理或协调系统操作时特别有用。

核心特点:

  1. 私有构造函数:防止外部通过new创建实例
  2. 静态私有成员变量:保存类的唯一实例
  3. 静态公有方法:提供获取实例的全局访问点,通常命名为getInstance()

实现方式:

1.实例方法:

class Person(object):name = '三笠'         # 类属性:类所拥有的属性def __init__(self):self.age = 18       # 实例属性:对象私有的def play(self):         # 实例方法# 在实例方法中访问类属性print(f'{Person.name}在玩游戏')print(self.age)
li = Person()
li.play()

2.静态方法:

class Person(object):name = '三笠'         # 类属性:类所拥有的属性def __init__(self):self.age = 18       # 实例属性:对象私有的@staticmethod       # 静态方法:类中的函数,形参没有限制def introduce():print(f'我是{Person.name}')   # 静态方法能够访问到类属性,但是没意义pass
li = Person()
li.introduce()

3.类方法:

class Person(object):name = '三笠'         # 类属性:类所拥有的属性def __init__(self):self.age = 18       # 实例属性:对象私有的@classmethod            # 类方法:针对类存在的方法def introduce(cls):     # cls代表类对象本身print(cls.name)print()
li = Person()
li.introduce()

优缺点分析:

优点:

  • 严格控制实例数量,节省系统资源
  • 提供全局访问点,方便管理共享资源
  • 避免频繁创建和销毁对象,提高性能

缺点:

  • 违反单一职责原则,既负责业务逻辑又控制实例创建
  • 过度使用会导致代码耦合度高
  • 难以进行单元测试,因为全局状态难以隔离
  • 在多线程环境下需要特殊处理才能保证线程安全

总结:

        类属性是公共的,它被定义在类层面而非实例层面,所有类的实例都可以共享访问这个属性。例如,在一个Student类中定义class_name="高三一班"作为类属性,那么所有Student的实例都能访问到这个班级名称。类属性可以通过类名直接访问(如Student.class_name),也可以通过实例访问(如student1.class_name)。所有类的实例方法、静态方法和类方法都能访问到这个属性。

        静态方法不需要访问类属性,因为静态方法和类、对象没有关联,它更像是一个独立于类的普通函数。静态方法使用@staticmethod装饰器定义,不会自动接收cls或self参数。例如,在MathUtils类中定义一个静态方法add(a,b)来计算两个数的和,这个方法不需要知道任何关于MathUtils类的信息就能正常工作。静态方法通常用于实现与类相关但不需要访问类状态的功能。

        实例属性是私有的,它只能在特定实例的方法内部被访问到。实例属性通常在__init__方法中初始化,每个实例都拥有自己的属性副本。例如,student1.name="张三"和student2.name="李四"就是两个不同的实例属性。只有实例方法(第一个参数为self的方法)能够访问这些属性,因为这些方法需要通过self参数才能引用到具体的实例属性。类方法和静态方法都无法直接访问实例属性,因为它们没有self参数来引用具体的实例。

2.魔法方法&魔法属性

1.什么是魔法方法:

        魔法方法(Magic Methods)是 Python 中一类特殊的方法,其名称以双下划线开头和结尾(如 __init____str__)。这些方法会在特定的情况下被 Python 自动调用,用于实现对象的特定行为或操作。

2.常见的魔法方法:

以下是一些常用的魔法方法及其用途:

  • __init__(self, ...):对象的初始化方法,在创建实例时自动调用。
  • __str__(self):定义对象的字符串表示形式,通常用于 print()str() 调用。
  • __repr__(self):定义对象的官方字符串表示形式,用于调试或 repr() 调用。
  • __len__(self):定义对象的长度,适用于 len() 调用。
  • __add__(self, other):定义对象的加法操作,如 obj1 + obj2
  • __eq__(self, other):定义对象的相等性比较,如 obj1 == obj2
  • __getitem__(self, key):定义对象的索引访问,如 obj[key]
  • __setitem__(self, key, value):定义对象的索引赋值,如 obj[key] = value
  • __delitem__(self, key):定义对象的索引删除,如 del obj[key]
  • __iter__(self):定义对象的迭代行为,用于 for 循环。
  • __next__(self):定义迭代器的下一个值。
  • __call__(self, ...):允许对象像函数一样被调用,如 obj()
3. 魔法属性的说明

        魔法属性(Magic Attributes)是 Python 中一些特殊的属性,通常用于获取对象的元信息或控制对象的行为。常见的魔法属性包括:

  • __dict__:存储对象的属性字典。
  • __class__:返回对象所属的类。
  • __doc__:获取对象的文档字符串(即 """...""" 的内容)。
  • __name__:获取类或函数的名称。
  • __module__:获取对象所属的模块名称。
4. 实际应用示例

以下是一个使用魔法方法的示例,定义一个简单的自定义列表类:

class MyList:def __init__(self, data=None):if data is None:self.data = []else:self.data = list(data)def __str__(self):return f"MyList: {self.data}"def __len__(self):return len(self.data)def __getitem__(self, index):return self.data[index]def __setitem__(self, index, value):self.data[index] = valuedef __iter__(self):return iter(self.data)# 使用示例
my_list = MyList([1, 2, 3])
print(my_list)          # 输出: MyList: [1, 2, 3]
print(len(my_list))     # 输出: 3
print(my_list[1])       # 输出: 2
my_list[1] = 99
print(my_list)          # 输出: MyList: [1, 99, 3]for item in my_list:print(item)         # 输出: 1, 99, 3

5. 魔法方法的注意事项
  • 魔法方法通常由 Python 解释器自动调用,不建议直接调用(如 obj.__init__())。
  • 魔法方法可以重写以定制对象的行为,但需确保不破坏其预期功能。
  • 合理使用魔法方法可以让自定义类更自然地融入 Python 的生态系统。

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

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

相关文章

【Kubernetes系列】Kubernetes 资源请求(Requests)

博客目录 引言一、资源请求的基本概念1.1 什么是资源请求1.2 请求与限制的区别 二、CPU 请求的深入解析2.1 CPU 请求的单位与含义2.2 CPU 请求的调度影响2.3 CPU 请求与限制的关系 三、内存请求的深入解析3.1 内存请求的单位与含义3.2 内存请求的调度影响3.3 内存请求的特殊性 …

大型语言模型中的自动化思维链提示

摘要 大型语言模型(LLMs)能够通过生成中间推理步骤来执行复杂的推理任务。为提示演示提供这些步骤的过程被称为思维链(CoT)提示。CoT提示有两种主要范式。一种使用简单的提示语,如“让我们一步一步思考”,…

Private Set Generation with Discriminative Information(2211.04446v1)

1. 遇到什么问题,解决了什么遇到的问题现有差分隐私生成模型受限于高维数据分布建模的复杂性,合成样本实用性不足。深度生成模型训练依赖大量数据,加入隐私约束后更难优化,且不保证下游任务(如分类)的最优解…

C++编程语言入门指南

一、C语言概述 C是由丹麦计算机科学家Bjarne Stroustrup于1979年在贝尔实验室开发的一种静态类型、编译式、通用型编程语言。最初被称为"C with Classes"(带类的C),1983年更名为C。它既具有高级语言的抽象特性,又保留了底层硬件操作能力&…

ZED相机与Foxglove集成:加速机器人视觉调试效率的实用方案

随着机器人技术的发展,实时视觉数据流的高效传输和可视化成为提升系统性能的重要因素。通过ZED相机(包括ZED 2i和ZED X)与Foxglove Studio平台的结合,开发者能够轻松访问高质量的2D图像、深度图和点云数据,从而显著提高…

目标检测新纪元:DETR到Mamba实战解析

🚀【实战分享】目标检测的“后 DEⱯ”时代:DETR/DINO/RT-DETR及新型骨干网络探索(含示例代码) 目标检测从 YOLO、Faster R-CNN 到 Transformer 结构的 DETR,再到 DINO、RT-DETR,近两年出现了许多新趋势&am…

【IOS】XCode创建firstapp并运行(成为IOS开发者)

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍XCode创建firstapp并运行 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路…

class类和style内联样式的绑定 + 事件处理 + uniapp创建自定义页面模板

目录 一.class类的绑定 1.静态编写 2.动态编写 二.style内联样式的绑定 三.事件处理 1.案例1 2.案例2 四.uniapp创建自定义页面模板 1.为什么要这么做? 2.步骤 ①打开新建页面的界面 ②在弹出的目录下,新建模板文件 ③用HBuilderX打开该模板…

android 卡顿和丢帧区别

Android 卡顿(Jank)与丢帧(Frame Drop)的核心区别在于问题本质与用户感知,以下是分层解析: ️ 一、本质差异 维度卡顿(Jank)丢帧(Frame Drop)定义用户可感知…

【python实用小脚本-125】基于 Python 的 Gmail 邮件发送工具:实现高效邮件自动化

引言 在现代办公和开发环境中,邮件通信是一种重要的沟通方式。自动化发送邮件可以大大提高工作效率,例如发送通知、报告或文件。本文将介绍一个基于 Python 的 Gmail 邮件发送工具,它能够通过 Gmail 的 SMTP 服务器发送邮件,并支持…

gateway断言配置详解

一、Predicate - 断⾔ 1、简单用法 spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- After2017-01-20T17:42:47.789-07:00[America/Denver] 2、自定义断言 新建类VipRoutePredicateFactory,注意VipRoutePredicateFactory名字…

基于大模型的尿毒症全流程预测与诊疗方案研究报告

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 国内外研究现状 二、尿毒症相关理论基础 2.1 尿毒症的定义、病因与发病机制 2.2 尿毒症的症状与诊断标准 2.3 尿毒症的治疗方法概述 三、大模型技术原理与应用 3.1 大模型的基本概念与发展历程 3.2 大模型…

裸金属服务器租用平台-青蛙云

企业对服务器性能与灵活性的要求与日俱增。青蛙云M-启强裸金属服务器租用平台应运而生,为企业提供了一种兼具物理机性能和云计算弹性的解决方案。裸金属服务器租用平台的优势​(一)高配性能,无虚拟化开销​裸金属服务器直接运行在物理硬件之上&#xff0…

[Terence Tao访谈] AlphaProof系统 | AI嗅觉 | 研究生学习 | 庞加莱猜想(高维) | 复杂问题简单化

玩这些有趣的东西。通常情况下什么也得不到,你必须学会说:“好吧,再试一次,什么都没发生,我会继续前进。” DeepMind的AlphaProof系统 Q:DeepMind的AlphaProof系统是通过强化学习训练的,使用的…

Aseprite工具入门教程4之动画导入Unity

1、时间轴功能 (1)眼睛图标 显示/隐藏图层图层隐藏时无法绘制 (2)锁定图标 锁定后无法移动或编辑图层防止意外在错误图层上绘制 (3)单元格图标 两个点代表帧分开,一个椭圆代表帧统一。分开就…

移动硬盘频繁提示格式化?解决异常故障的正确方法

移动硬盘作为数据存储的重要工具,不少人都习惯将照片、文档、项目资料甚至整台电脑的备份都放在里面。但有时,一件令人头疼的事悄然发生: 插上硬盘,系统却突然提示:“使用驱动器中的光盘之前需要将其格式化。是否要将…

Java泛型笔记

1 为什么需要泛型 Java5之前,是没有泛型的。通过两段代码我们就可以知道为何我们需要泛型 public int addInt(int a, int b) {return a b; }public double addDouble(double a, double b) {return a b; } 实际开发中,经常有数值类型求和的需求&…

mysql 图形化界面工具 DataGrip 安装与配置

安装地址: Download DataGrip: Cross-Platform IDE for Databases & SQLhttps://www.jetbrains.com/datagrip/download/?sectionwindows 添加数据源: 下载驱动文件:直接点击下载即可 点击测试连接:成功后点击确定 显示所有数…

linux下进程之间socket通信c程序例程

以下是一个基于 Linux 的 C 程序示例,展示了如何使用 Unix 域套接字(Unix domain socket)在不同进程之间互传 JSON 消息。我们将实现一个简单的客户端 - 服务器模型,服务器监听连接,客户端连接到服务器并发送 JSON 消息…

高云GW5AT-LV60 FPGA图像处理板|MIPI摄像头帧率测试

高云GW5AT-LV60 FPGA图像处理板套件中附带了三个摄像头模组,这三个模组真是各有千秋,接下来我通过简单的一些测试来看看这几个摄像头的差异。 VS-SC130GS 、 VS-SC2210 这两个模组是手动对焦,在使用时需要手动转动镜头调整焦距,这…