Python 单例模式工厂模式和classmethod装饰器
前言:
Python作为面向对象的语言,显然支持基本的设计模式。也具备面向对象的语言的基本封装方法:属性、方法、继承、多态等。但是,做为强大的和逐渐发展的语言,python也有很多高级的变种方法,以适应更多的场景。
我们都知道单例和工厂模式在设计模式中,其实就是一种怪胎。其实就是他们都不是经典的面向对象能够覆盖的场景。
例如,单例,他其实就是非常适配于一个硬件的操控的用例。而工程模型,主要关注的不同的对象的多态的变化。这两张,从根本上讲是从典型的面向对象的体系里面分离出来的典型的普通的例子。
由此,Python作为一个语言也发展出相对应的的适配的额外的方法,就如,我们这章将展示的方法。
1 设计模式的基本概念:
1.1 单例模式:
单例模式确保一个类只有一个实例,并提供一个全局访问点。
class Singleton:_instance = Nonedef __new__(cls):if cls._instance is None:cls._instance = super(Singleton, cls).__new__(cls)return cls._instance# 使用单例模式
singleton1 = Singleton()
singleton2 = Singleton()print(singleton1 is singleton2) # 输出 True,表示两个变量指向同一个实例
【案,这里创建了两个实例, singleton1 和singleton2 ,这两个不同名字的类实例,其实是一个东西。如果我们用类来代表一个硬件,比如机器视觉的相机或者是PLC,这些都是硬件实体。我们需要用这个实例模式来定义,以避免同一个硬件资源被其他的的任务复用】
1.2 工厂模式:
工厂模式是一种创建型设计模式,它使用工厂方法来创建对象,而不是直接调用构造函数。
class Car:def __init__(self, model, color):self.model = modelself.color = colordef speak(self):return f"This is a {self.model} in {self.color}."class ElectricCar(Car):def speak(self):return f"This is an electric {self.model} in {self.color}."class SportsCar(Car):def speak(self):return f"This is a sports {self.model} in {self.color}."class CarFactory:def create_car(self, model, color, car_type):if car_type == "electric":return ElectricCar(model, color)elif car_type == "sports":return SportsCar(model, color)else:return Car(model, color)# 使用工厂模式创建不同类型的汽车
factory = CarFactory()
my_car = factory.create_car("Toyota Camry", "red", "normal")
my_electric_car = factory.create_car("Nissan Leaf", "blue", "electric")
my_sports_car = factory.create_car("Porsche 911", "yellow", "sports")print(my_car.speak()) # 输出 "This is a Toyota Camry in red."
print(my_electric_car.speak()) # 输出 "This is an electric Nissan Leaf in blue."
print(my_sports_car.speak()) # 输出 "This is a sports Porsche 911 in yellow."
【案,在这个例子中,CarFactory
类的 create_car
方法根据传入的 car_type
参数来决定创建哪种类型的 Car
实例。这样,如果未来需要添加新的汽车类型,比如 HybridCar
,你只需要在 CarFactory
类中添加相应的逻辑,而不需要修改其他使用汽车对象的代码。这就是工厂模式的价值所在:它封装了对象的创建逻辑,使得代码更加模块化和易于扩展。】
2 classmethod的装饰器和staticmethod装饰器:
前面的例子里面,我们看到了传统的单例和工厂模式的引入。传统的单例和工厂模式的设计,比较方便的是继承和多态。通过实例,比较方便的是构建继承和多态的方法。但,主要的问题就是需要考虑构建实例后才能使用,这样对多个实例支持的硬件案例,就很麻烦。
2.1 classmethod
在Python中,@classmethod
是一个装饰器,用于将一个方法定义为类方法(class method)。类方法与普通的方法(instance method)不同,它不依赖于类的实例(instance),而是依赖于类本身。这意味着类方法的第一个参数总是指向类本身,通常命名为cls
。
【方法,我们知道面向对象的语言里面,方法就是对象能做哪些事情。一般,方法的定义依赖于类创建的实例,也就是先创建实例,类的方法才有用。而classmethod,是创建了一个类方法。】
类方法的主要作用包括:
访问类变量:类方法可以直接访问类的变量,而不需要创建类的实例。
创建实例:类方法可以用来创建类的实例,这在工厂模式中很常见。
修改类状态:类方法可以修改类的状态,比如添加类变量或者修改类属性。
继承时保持一致性:在继承时,类方法可以确保子类能够访问父类的类方法。
实现单例模式:类方法可以用来实现单例模式,确保一个类只有一个实例。
【案,类的方法有别于传统定义的方法,其实就是提供一个直接方法类定义的途径,以避免之前构建单例模式和工厂那种形而上学的方式(比如前面的单例构建,其实通过类方法就很简洁,不需要构造一个单例】
class MyClass:count = 0 # 类变量@classmethoddef increment_count(cls):cls.count += 1@classmethoddef get_count(cls):return cls.count# 使用类方法
MyClass.increment_count()
print(MyClass.get_count()) # 输出 1
上面的代码,就是在类里面创立了类方法,increment_count,这样直接用类的名字+类方法就可以完成对类的控制了。
这一点,对单例模式(硬件代表)尤其方便,我本来类就是代表硬件特性,采用了类方法,就可以直接方便的访问这些硬件的功能了。
【案,值得注意的是,get_count的方法的第一个参数cls,是类Myclass本身。】cls = class .
现在,我们把第一节里面的工厂模式,用classmethod的类方法进行修改。
class Animal:def speak(self):raise NotImplementedError("Subclasses must implement this method")class Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"class AnimalFactory:@classmethoddef get_animal(cls, animal_type):if animal_type == "dog":return Dog()elif animal_type == "cat":return Cat()else:raise ValueError("Unknown animal type")# 使用工厂模式
dog = AnimalFactory.get_animal("dog")
cat = AnimalFactory.get_animal("cat")print(dog.speak()) # 输出 "Woof!"
print(cat.speak()) # 输出 "Meow!"
在这个示例中,
AnimalFactory
类的get_animal
方法被定义为一个类方法,使用@classmethod
装饰器。这意味着get_animal
方法的第一个参数是类本身,这里我们命名为cls
。在这个方法中,我们根据传入的animal_type
参数来创建相应的动物实例。使用@classmethod
的好处是,我们可以在不创建类实例的情况下调用这个方法,这在工厂模式中是常见的做法,因为工厂方法通常不需要类的特定实例,而是需要类本身来创建新实例。
2.2 staticmethod
class Dog:def speak(self):return "Woof!"class Cat:def speak(self):return "Meow!"class AnimalFactory:@staticmethoddef get_animal(animal_type):if animal_type == "dog":return Dog()elif animal_type == "cat":return Cat()else:raise ValueError("Unknown animal type")# 使用工厂模式
dog = AnimalFactory.get_animal("dog")
cat = AnimalFactory.get_animal("cat")print(dog.speak()) # 输出 "Woof!"
print(cat.speak()) # 输出 "Meow!"
【案,在工厂模式里面,我们创建了猫和狗两个类,然后,我们没有用猫和狗的类来创建实例。而是通过动物的类,让后,通过动物类来调用猫和狗的类的实例的创建。】
使用
@staticmethod
的缺点:
灵活性:静态方法不能被子类重写,这限制了它们的灵活性。如果你需要在子类中改变创建实例的行为,静态方法不是一个好选择。
继承:由于静态方法不属于类的MRO(方法解析顺序),它们不能被继承。
多态性:静态方法不支持多态,这意味着你不能在子类中重写它们来改变行为。
3 小结:
3.1 self 和 cls
self
参数:
self
引用的是类的实例。
- 用途:
self
是实例方法的第一个参数,用于访问和修改实例的状态(属性和方法)。- 行为:
self
指向调用方法的实例。当你通过实例调用一个方法时,Python自动将该实例作为self
参数传递给方法。
cls
参数:
cls
引用的是类本身。
- 用途:
cls
是类方法的第一个参数,用于访问和修改类的状态(类属性和方法),以及创建类的实例。- 行为:
cls
指向类本身。类方法可以通过cls
访问类属性和方法,也可以调用其他类方法,并且可以创建类的实例。
3.1.1 self的例子:
class MyClass:def __init__(self, value):self.value = value # 使用 self 访问实例属性def print_value(self):print(self.value) # 使用 self 访问实例属性instance = MyClass(10)
instance.print_value() # 输出 10
【self,在例子里面作为一个默认的参数,对外是封装的,透明的。在创建类的实例的时候函数init,传递第二个参数的时候,self自动起了衔接类之间的指代和传递的工作,最终,value=50,通过self赋值给了实例里面的类value,self理解为类内部的一个句柄】
3.1.2 cls的例子:
class MyClass:class_var = "I am a class variable"@classmethoddef print_class_var(cls):print(cls.class_var) # 使用 cls 访问类属性@classmethoddef create_instance(cls, value):return cls(value) # 使用 cls 创建实例MyClass.print_class_var() # 输出 "I am a class variable"
new_instance = MyClass.create_instance(20)
new_instance.print_value() # 输出 20
【案,上面这个例子很好的说明了cls的使用,结合classmethod,首先,通过create_instance方法+cls,类内部句柄,构造了一个类内部的动态实例构造,cls(value),然后在调用这个创建实例的方法的时候,传入了外部参数value。】
3.2 classmethod(类方法) and staticmethod(静态类)
3.2.1 classmethod(类方法)
class MyClass:class_var = "I am a class variable"@classmethoddef my_class_method(cls):print("Class variable:", cls.class_var)MyClass.my_class_method() # 输出 "Class variable: I am a class variable"
3.2.2 staticmethod
class Car:def __init__(self, model):self.model = modeldef speak(self):return f"This is a {self.model}"class CarFactory:@staticmethoddef create_car(model):return Car(model)# 使用工厂模式
my_car = CarFactory.create_car("Toyota Camry")
print(my_car.speak()) # 输出 "This is a Toyota Camry"
【案,我们看到这两种方法的主要区别,就是要不要构建实例来访问类方法。当然,类方法也可以构造实例如本文3.1.2,需要写一点构造实例的方法,但是,比静态方法要简洁,此外,也更容易做多态的变换】
对应工厂模式而言:
- 如果你需要一个简单的工厂方法,不需要访问类属性,也不想被子类重写,那么静态方法是一个很好的选择。
- 如果你需要在子类中重写工厂方法,或者需要访问类属性来决定如何创建实例,那么类方法是更好的选择。
相关文章:
Python 单例模式工厂模式和classmethod装饰器
前言: Python作为面向对象的语言,显然支持基本的设计模式。也具备面向对象的语言的基本封装方法:属性、方法、继承、多态等。但是,做为强大的和逐渐发展的语言,python也有很多高级的变种方法,以适应更多的…...
源码编译构建LAMP
源码编译构建LAMP 文章目录 源码编译构建LAMPLAMPDISCUZ论坛 1.安装编译工具等2.apache3.mysql4.php5.部署论坛网站6.其他6.其他 LAMPDISCUZ论坛 1.安装编译工具等 安装说明: 配置yum源 从阿里云下载新的配置文件 curl -o /etc/yum.repos.d/CentOS-Base.repo htt…...
如何让verilog支持二维数组,三维数组作为I/O ports
写在前面 先看看verilog中的一维数组,二维数组,三维数组长啥样? wire [31:0]data1;//一维数组 wire [31:0]data2 [0:15];//二维数组 wire [31:0]data3 [0:15][0:15];//三维数组众所周知,verilog只支持一维数组作为I/O ports&…...
字符编码讲解(C#)
在学习和编码的过程中,极容易遇到如下概念,他们有些是字符编码,有些是涉及的相关概念,接下来我将围绕下面的熟悉又陌生的概念做详细解释,并且梳理其之间的关系 UTF8, Unicode ,ASCII࿰…...
Unreal Engine 中的UI界面开发
推荐的使用方式 轻量级 HUD:使用 Canvas 绘制简单的文本、调试信息或基础 UI(如准星、血量条等)。 复杂 UI:使用 UMG(Unreal Motion Graphics)和 Slate 进行布局和交互,避免手动管理 Canvas 绘制…...
聚类及Python下实现 K-means 算法
聚类 聚类是无监督学习中的一种重要方法,旨在将数据集中相似的数据对象划分到同一个簇中,使得不同簇之间的数据对象差异尽可能大。在大数据环境下,聚类可以帮助挖掘数据中的隐藏结构和模式,应用场景十分广泛,比如在客…...
【中间件开发】Redis基础命令详解及概念介绍
文章目录 前言一、Redis相关命令详解及原理1.1 string、set、zset、list、hash1.1.1 string1.1.2 list1.1.3 hash1.1.4 set1.1.5 zset 1.2 分布式锁的实现1.3 lua脚本解决ACID原子性1.4 Redis事务的ACID性质分析 二、Redis协议与异步方式2.1 Redis协议解析2.1.1 redis pipeline…...
分布式文件存储 - - - MinIO从入门到飞翔
MinIO从入门到飞翔 文章目录 MinIO从入门到飞翔 0、前言1、分布式文件系统2、MinIO 介绍3、 MinIO安装(docker)4、基本概念5、通过代码上传文件到MinIO6、封装MinIO为starter7、在其他项目中集成封装好的模块 0、前言 对象存储是一种数据存储架构&a…...
Cadence学习笔记 1 原理图库绘制
基于Cadence 17.4,四层板4路HDMI电路 目录 一、原理图绘制及封装制作 1、原理图库绘制简介 一、原理图绘制及封装制作 1、原理图库绘制简介 File--Change Product,选择OrCAD Capture CIS。绘制原理图和原理图库都是用CIS完成 更改界面颜色:…...
Unity 制作一个视频播放器(打包后,可在外部编辑并放置新的视频)
效果展示: 在这里,我把视频名称(Json)和对应的视频资源都放在了StreamingAssets文件夹下,以便于打包后,客户还可以自己在外部增加、删除、修改对应的视频资料。 如有需要,请联细抠抠。...
python爬虫--小白篇【爬虫实践】
一、前言 1.1、王者荣耀皮肤爬虫 根据王者荣耀链接,将王者荣耀的全部英雄的全部皮肤图片爬取保存到本地。经过分析得到任务的三个步骤: 根据首页全部英雄列表连接获取全部英雄的名称hero_name以及对应的hero_id;根据单个英雄的hero_name和h…...
CountDownLatch阻塞后countDown未执行会如何?
背景 某项目封装了 Kafka 消费者 API,根据传递的消费者线程数,创建 N 个消费者线程同时消费对应 topic 的数据,并在线程启动后收集到全局列表中,方便在程序调用 stop 流程时逐个停止。 主控类在创建 Kafka 消费线程时使用了 Cou…...
《MySQL 查询进阶:复杂查询语句的魅力》
一、引言 MySQL 的复杂查询语句就像是一把神奇的钥匙,能够打开数据世界的大门,展现出数据的无限魅力。本文将带你深入探索 MySQL 查询进阶技巧,从常用查询到子查询,再到视图的运用,让你领略复杂查询语句的强大功能。 …...
Vue解决跨域问题
要解决 Vue 项目的跨域问题并通过 vue.config.js 配置代理,可以按照以下步骤修改 vue.config.js 文件。你提供的代码大部分已经正确,只需要做一些格式上的调整。以下是正确的 vue.config.js 配置: // vue.config.jsmodule.exports {devServ…...
大语言模型(LLM)与智能机器人的应用分析
系列文章目录 前言 近年来,大型语言模型(LLM)的集成彻底改变了机器人领域,使机器人能够以人类熟练程度进行交流、理解和推理。本文探讨了 LLM 对机器人的多方面影响,并针对在不同领域利用这些模型的关键挑战和机遇进行了研究。通过将 LLM 应用程序分类并分析核心机器人元素…...
String【Redis对象篇】
🏆 作者简介:席万里 ⚡ 个人网站:https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜,同时略懂Vue与React前端技术,也了解一点微信小程序开发。 🍻 对计算机充满兴趣,愿意并且希望学习更多的技…...
Elasticsearch高性能实践
前言 本方案主要从运维层面分析es是实际生产使用过程中的参数优化,深入理解es各个名词及含义,深入分析es的使用过程中应注意的点,详细解释参数设置的原因以及目的,主要包括系统层面,参数层面。除此之外,优…...
Maven 安装配置(详细教程)
文章目录 一、Maven 简介二、下载 Maven三、配置 Maven3.1 配置环境变量3.2 Maven 配置3.3 IDEA 配置 四、结语 一、Maven 简介 Maven 是一个基于项目对象模型(POM)的项目管理和自动化构建工具。它主要服务于 Java 平台,但也支持其他编程语言…...
sql server 创建索引实验
创建一个非主键索引,大小30G,数据文件增加了30G,日志文件增长了50G,4分钟完成, (日志文件增加设置为2048MB 或者 256MB 执行时间都是4分钟,没有多大的时间差异) 实验环境: 主机cpu…...
解决Vue项目中npm install卡住问题的详细指南
解决Vue项目中npm install卡住问题的详细指南 引言 在开发Vue项目时,我们经常会遇到npm install命令卡住的问题,特别是在构建依赖树时。本文将分享一些实用的解决方案,帮助您快速解决这一常见问题。 问题描述 在执行npm install时…...
手机实时提取SIM卡打电话的信令声音--社会价值(一、方案解决了什么问题)
手机实时提取SIM卡打电话的信令声音 --社会价值(一、方案解决了什么问题) 一、前言 这段时间,我们在技术范围之外陷入了一个自证或者说下定义的怪圈,即要怎么样去介绍或者描述:我们是一个什么样的产品。它在当前这个世界上,处于…...
35.1 thanos项目介绍和二进制部署
本节重点介绍 : 核心优点 无需维护存储,存储高可用: 利用廉价的公有云对象存储,高可用长时间存储,数据降采样:利用Compactor降采样完全适配原生prometheus查询接口:Query实现多级数据缓存配置 二进制部署 …...
【中工开发者】鸿蒙商城实战项目(启动页和引导页)
创建一个空项目 先创建一个新的项目选择第一个,然后点击finish 接下来为项目写一个名字,然后点击finish。 把index页面的代码改成下面代码块的代码,就能产生下面的效果 Entry Component struct Index {build() {Column(){Blank()Column(){…...
云计算IaaS-PaaS-SaaS三种服务模式转至元数据结尾
在当今数字化时代,云计算已经成为推动企业创新与发展的核心力量。而云计算的模型主要有三种:IAAS、PAAS 和 SAAS,它们各自在云计算的庞大体系中扮演着独特且关键的角色,恰似一座大厦的不同楼层,共同构建起强大而灵活的…...
Python爬虫:如何优雅地“偷窥”商品详情
在这个信息爆炸的时代,获取商品详情已经不再是简单的点击和浏览。我们需要的是速度、效率,还有一点点的...偷偷摸摸。没错,今天我们要聊的是如何使用Python爬虫来“偷窥”商品详情。别担心,我们保证一切都是合法合规的,…...
自动化测试报错:Exception managing chrome: error decoding response body
报错:Exception managing chrome: error decoding response body 报错解释: 这个错误通常发生在使用Selenium WebDriver时,尝试管理(例如关闭)Chrome浏览器时出现了问题。具体来说,是在解码Chrome浏览器响…...
Dataset 与 JavaRDD
是的,Dataset 底层确实是基于 RDD 实现的,但它是通过更高层次的抽象和优化来提供更强大和易用的功能。以下是关于 Dataset 底层实现的一些详细信息: 1. RDD 是基础 RDD(弹性分布式数据集) 是 Spark 最基础的抽象&…...
【后端面试总结】Golang defer的实现原理和常见面试问题
前言 在Go语言中,defer关键字用于延迟函数的执行,即在包含defer语句的函数返回之前执行。这一特性使得defer在资源释放、文件关闭、解锁资源等场景中非常有用。本文将深入探讨defer的实现原理,并总结一些常见的面试问题。 基本使用 defer通…...
http 502 和 504 的区别
首先看一下概念: 502:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。503:由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢…...
农业园区气象站
农业园区气象站是一种专为农业生产和科研设计的气象监测设备,它集成了多种传感器和技术,用于实时、准确地监测和记录农业园区内的气象数据。以下是农业园区气象站的主要功能和用处: 一、主要功能 实时监测:农业园区气象站能够实时…...
机器学习学习笔记-20241211
文章目录 空间归纳偏置局部性(Locality)平移不变性(Translation Invariance)空间关系(Spatial Relationships)尺度不变性(Scale Invariance)上下文依赖(Context Dependen…...
【在Linux世界中追寻伟大的One Piece】HTTP Session
目录 1 -> 引入HTTP Session 1.1 -> 定义 1.2 -> 工作原理 1.3 -> 安全性 1.4 -> 超时和失效 1.5 -> 用途 2 -> 模拟session行为 3 -> 实验测试session 1 -> 引入HTTP Session 1.1 -> 定义 HTTP Session是服务器用来跟踪用户与服务器交…...
人工智能|自然语言处理——机器翻译评价指标Bleu和Rouge
在机器翻译任务中,BLEU 和 ROUGE 是两个常用的评价指标,BLEU 根据精确率(Precision)衡量翻译的质量,而 ROUGE 根据召回率(Recall)衡量翻译的质量 BLEU(Bilingual Evaluation Understudy): BLEU是一种用于评…...
【前端】JavaScript中的函数形式参数:预解析与作用域详解
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯示例代码💯1. 形式参数的预解析模拟预解析后的代码 💯2. 函数作用域与子函数的关系代码详解 💯3. 扩展:块作用域与变量提…...
自然语言处理的未来愿景
自然语言处理的未来愿景 在这个信息爆炸的时代,计算机如何理解和生成我们日常使用的语言,已经成为一个引人注目的问题。你有没有想过,为什么智能助手能理解你的指令?又或者,为什么社交媒体上的推荐引擎能够精准地推荐你喜爱的内容?这背后,正是自然语言处理(NLP)在发挥…...
Vmodel环境配置
1.conda create -n pytorch311 python3.11 # 重新进入虚拟环境 source activate # 退出虚拟环境 conda deactivate 最后,重新执行 conda activate pytorch311 pip install torch-2.0.0cpu-cp311-cp311-linux_x86_64 配置Graph-WaveNet网络: pip…...
nvm-windows | node版本管理
问题: npm ERR! notsup Not compatible with your version of node/npm: npm10.9.2 npm ERR! notsup Required: {"node":"^18.17.0 || >20.5.0"} npm ERR! notsup Actual: {"npm":"9.5.0","node":"v18.…...
GLM-4V-Flash:智谱AI引领多模态视觉模型新潮流
点击访问 chatTools 免费体验GPT最新模型,包括o1推理模型、GPT4o 和Claude等模型! 随着人工智能技术的不断进步,多模态模型逐渐成为行业关注的焦点。智谱AI作为国内领先的人工智能公司,再次以创新姿态推出了首款免费多模态视觉模型…...
二、ubuntu单盘改软raid1
将单盘系统转换为软 RAID 1 是一个复杂的过程,尤其是在已经有数据的生产环境中进行时。这个过程涉及备份现有数据、创建 RAID 阵列、迁移数据以及更新引导加载程序(如 GRUB)。以下是详细的步骤指南: 前提条件 备份数据ÿ…...
「Mac玩转仓颉内测版45」小学奥数篇8 - 排列组合计算
本篇将通过 Python 和 Cangjie 双语讲解如何计算排列与组合。这道题目旨在让学生学会使用排列组合公式解决实际问题,并加深对数学知识和编程逻辑的理解。 关键词 小学奥数Python Cangjie排列与组合 一、题目描述 编写一个程序,计算从 n 个不同元素中取…...
【零成本抽象】基本概念与在C++中的实现
零成本抽象概念是由 Bjarne Stroustrup 提出的,他在 1994 年的著作中就有相关设想,2016 年其在 C++ 大会登台演讲时,明确阐述了 C++ 中的 “零成本抽象” 这一理念。 一、零成本抽象概念 Bjarne Stroustrup提出的零成本抽象概念,是指在编程中使用高级抽象机制时,不会产生…...
域渗透入门靶机之HTB-Cicada
easy难度的windows靶机 信息收集 端口探测 nmap -sT --min-rate 10000 -p- 10.10.11.35 -oA ./port 发现开放了53,88,389等端口,推测为域控 进一步信息收集,对爆破的端口进行更加详细的扫描 小tips:对于众多的端口&…...
(仓颉) Cangjie 刷力扣基础语法小结
文章目录 🧓官方资料🧓力扣经典前 3 题🕷️[1. 两数之和 - 力扣(LeetCode)](https://leetcode.cn/problems/two-sum/description/)🕷️[2. 两数相加 - 力扣(LeetCode)](https://leet…...
Phoenix5.1.3安装
环境说明 准备三台服务器,分别为:bigdata141(作为HBase主节点)、bigdata142、bigdata143,已经搭建好HBase集群,我这边HBase版本为2.2.7再准备一台服务器,bigdata144,可作为Phoenix客…...
深入理解 Apache Shiro:安全框架全解析
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在…...
机器学习:全面学习路径指南
摘要: 本文精心规划了一条从入门到精通机器学习的学习路线,详细涵盖了基础理论构建、核心技术栈掌握、主流算法学习、实践项目锻炼以及前沿领域探索等多个关键阶段。通过逐步深入各个层面,介绍必备的数学知识、编程工具、经典与现代机器学习算…...
二叉树交换相关算法题|递归/非递归交换所有节点左右子树(C)
交换左右子树 设树B是一棵采用链式结构存储的二叉树,编写一个把树B中所有节点的左右子树进行交换的函数 算法思想 采用递归算法实现交换二叉树的左右子树,首先交换root节点左孩子的左右子树,然后交换root节点右孩子的左右子树,…...
什么是纯虚函数?什么是抽象类?纯虚函数和抽象类在面向对象编程中的意义是什么?
纯虚函数 纯虚函数是一个在基类中声明但不实现的虚函数。它的声明方式是在函数声明的末尾添加 0。这意味着这个函数没有提供具体的实现,任何继承这个基类的派生类都必须提供这个函数的实现,否则它们也会变成抽象类,无法实例化。 示例&#…...
高效利用资源:分布式有状态服务的高可靠性设计
在分布式系统设计中,实现有状态服务的高可靠性通常采用主备切换的方式。当主服务停止工作时,备服务接管任务,例如通过Keepalive实现VIP的切换以保证可用性。然而,这种方式存在资源浪费的问题,因为备服务始终处于空转状…...
网络安全中的 SOC 是什么?
当今世界,网络威胁日益增多,确保网络安全已成为各种规模企业的首要任务。网络安全讨论中经常出现的一个术语是 SOC,即安全运营中心的缩写。但网络安全中的 SOC 是什么呢? SOC在防御网络威胁、管理安全事件和全天候监控系统方面发…...