当前位置: 首页 > news >正文

Python中的设计模式与最佳实践【第166篇—设计模式】

👽发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。

Python中的设计模式与最佳实践

在软件开发中,设计模式是一种解决常见问题的经过验证的解决方案。Python作为一种流行的编程语言,具有丰富的库和灵活的语法,使其成为实现设计模式的理想选择。本文将介绍几种常见的设计模式,并提供相应的Python示例代码,以便读者了解如何在Python中应用这些设计模式。

image-20240326010730581

1. 单例模式(Singleton Pattern)

单例模式确保一个类只有一个实例,并提供全局访问点。

class Singleton:_instance = Nonedef __new__(cls):if cls._instance is None:cls._instance = super().__new__(cls)return cls._instance# 示例
singleton1 = Singleton()
singleton2 = Singleton()print(singleton1 is singleton2)  # Output: True

2. 工厂模式(Factory Pattern)

工厂模式用于创建对象的接口,但允许子类决定实例化哪个类。它将实例化逻辑委托给子类。

from abc import ABC, abstractmethodclass Animal(ABC):@abstractmethoddef sound(self):passclass Dog(Animal):def sound(self):return "Woof!"class Cat(Animal):def sound(self):return "Meow!"class AnimalFactory:def get_animal(self, animal_type):if animal_type == "dog":return Dog()elif animal_type == "cat":return Cat()else:raise ValueError("Invalid animal type")# 示例
factory = AnimalFactory()
dog = factory.get_animal("dog")
cat = factory.get_animal("cat")print(dog.sound())  # Output: Woof!
print(cat.sound())  # Output: Meow!

3. 观察者模式(Observer Pattern)

观察者模式定义了对象之间的一对多依赖关系,使得当一个对象的状态发生变化时,其所有依赖项都会收到通知并自动更新。

class Observer:def update(self, message):passclass Subject:def __init__(self):self._observers = []def add_observer(self, observer):self._observers.append(observer)def remove_observer(self, observer):self._observers.remove(observer)def notify_observers(self, message):for observer in self._observers:observer.update(message)class MessagePublisher(Subject):def publish_message(self, message):self.notify_observers(message)class MessageSubscriber(Observer):def __init__(self, name):self.name = namedef update(self, message):print(f"{self.name} received message: {message}")# 示例
publisher = MessagePublisher()
subscriber1 = MessageSubscriber("Subscriber 1")
subscriber2 = MessageSubscriber("Subscriber 2")publisher.add_observer(subscriber1)
publisher.add_observer(subscriber2)publisher.publish_message("Hello, observers!")# Output:
# Subscriber 1 received message: Hello, observers!
# Subscriber 2 received message: Hello, observers!

4. 策略模式(Strategy Pattern)

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。该模式可以使算法的变化独立于使用它们的客户端。

from abc import ABC, abstractmethodclass Strategy(ABC):@abstractmethoddef execute(self, a, b):passclass AddStrategy(Strategy):def execute(self, a, b):return a + bclass SubtractStrategy(Strategy):def execute(self, a, b):return a - bclass Context:def __init__(self, strategy):self._strategy = strategydef execute_strategy(self, a, b):return self._strategy.execute(a, b)# 示例
add_strategy = AddStrategy()
subtract_strategy = SubtractStrategy()context = Context(add_strategy)
result1 = context.execute_strategy(5, 3)  # Output: 8context = Context(subtract_strategy)
result2 = context.execute_strategy(5, 3)  # Output: 2

5. 装饰器模式(Decorator Pattern)

装饰器模式允许向一个对象动态地添加新功能,同时不改变其结构。它是一种以透明、动态方式扩展对象的功能。

def make_bread(func):def wrapper():print("Mixing ingredients")func()print("Baking the bread")return wrapper@make_bread
def make_sandwich():print("Making sandwich")make_sandwich()# Output:
# Mixing ingredients
# Making sandwich
# Baking the bread

6. 原型模式(Prototype Pattern)

原型模式用于创建对象的一种模式,通过复制现有对象来创建新对象,从而避免了使用复杂的构造函数。

import copyclass Prototype:def __init__(self):self._objects = {}def register_object(self, name, obj):self._objects[name] = objdef unregister_object(self, name):del self._objects[name]def clone(self, name, **attrs):obj = copy.deepcopy(self._objects.get(name))obj.__dict__.update(attrs)return obj# 示例
class Car:def __init__(self):self.make = "Toyota"self.model = "Corolla"self.year = "2022"car_prototype = Car()
prototype = Prototype()
prototype.register_object("car", car_prototype)car = prototype.clone("car", year="2023")

这段代码展示了原型模式(Prototype Pattern)的实现。原型模式用于创建对象的一种模式,它允许通过复制现有对象来创建新对象,而不是通过实例化类来创建。让我们来解析一下:

  1. Prototype类:

    • __init__ 方法初始化一个空字典 _objects,用于存储注册的对象。
    • register_object 方法用于注册对象,将对象存储在 _objects 字典中,以便稍后克隆使用。
    • unregister_object 方法用于注销对象,从 _objects 字典中删除特定名称的对象。
    • clone 方法用于克隆对象。它接受一个名称参数,指定要克隆的对象的名称,并且可以接受额外的关键字参数来更新克隆对象的属性。它使用 copy.deepcopy 创建对象的深层副本,以避免对象间共享状态的问题。然后通过更新克隆对象的 __dict__ 属性来应用任何额外的属性更改,然后返回克隆后的对象。
  2. 示例类 Car:

    • 定义了一个简单的 Car 类,具有 make、model 和 year 属性。这是我们要克隆的对象的示例。
  3. 使用原型模式:

    • 创建了一个 Car 类的实例 car_prototype
    • 创建了一个 Prototype 实例 prototype
    • 使用 register_object 方法将 car_prototype 注册到原型中,名称为 “car”。
    • 使用 clone 方法从原型中克隆一个 Car 对象,名为 “car”,并且更新了 year 属性为 “2023”。

总之,这段代码演示了如何使用原型模式创建和管理对象的实例,以及如何在创建新对象时进行自定义属性更新。

image-20240326010909501

7. 建造者模式(Builder Pattern)

建造者模式用于创建复杂对象,它将对象的构建过程与其表示分离,从而可以按照不同的方式构建对象。

class Computer:def __init__(self, cpu, memory, storage):self.cpu = cpuself.memory = memoryself.storage = storageclass ComputerBuilder:def __init__(self):self._computer = Computer("", "", "")def set_cpu(self, cpu):self._computer.cpu = cpureturn selfdef set_memory(self, memory):self._computer.memory = memoryreturn selfdef set_storage(self, storage):self._computer.storage = storagereturn selfdef build(self):return self._computer# 示例
builder = ComputerBuilder()
computer = builder.set_cpu("Intel").set_memory("8GB").set_storage("256GB SSD").build()

8. 命令模式(Command Pattern)

命令模式将请求封装为对象,以便可以参数化其他对象对请求的执行、将请求排队或记录请求日志,以及支持可撤销的操作。

from abc import ABC, abstractmethodclass Command(ABC):@abstractmethoddef execute(self):passclass Light:def turn_on(self):print("Light is on")def turn_off(self):print("Light is off")class LightOnCommand(Command):def __init__(self, light):self._light = lightdef execute(self):self._light.turn_on()class LightOffCommand(Command):def __init__(self, light):self._light = lightdef execute(self):self._light.turn_off()class RemoteControl:def __init__(self):self._commands = {}def set_command(self, slot, command):self._commands[slot] = commanddef press_button(self, slot):if slot in self._commands:self._commands[slot].execute()# 示例
light = Light()
light_on = LightOnCommand(light)
light_off = LightOffCommand(light)remote = RemoteControl()
remote.set_command(1, light_on)
remote.set_command(2, light_off)remote.press_button(1)  # Output: Light is on
remote.press_button(2)  # Output: Light is off

这段代码展示了命令模式(Command Pattern)的实现,用于将请求封装成对象,从而使你能够参数化客户端对象以在不同的请求之间进行参数化。现在让我们来解析它:

  1. Command 类:

    • 是一个抽象基类 (Abstract Base Class, ABC),其中定义了一个抽象方法 execute(),它将在具体命令类中实现。所有具体命令类都必须实现这个方法。
  2. Light 类:

    • 定义了一种名为 Light 的简单设备,具有两种操作:turn_on()turn_off()
  3. 具体命令类 LightOnCommand 和 LightOffCommand:

    • 这两个类实现了 Command 类。它们分别将 Light 对象作为参数,在 execute() 方法中调用了 Light 对象的 turn_on()turn_off() 方法,实现了对 Light 设备的控制。
  4. RemoteControl 类:

    • 这是一个遥控器类,其中包含一个字典 _commands,用于存储命令对象。
    • set_command() 方法用于将命令对象与特定的槽位关联起来。
    • press_button() 方法用于按下特定槽位的按钮,如果有与该槽位关联的命令对象,则执行该命令。
  5. 示例:

    • 创建了一个 Light 对象。
    • 创建了两个具体命令对象,分别用于打开和关闭 Light。
    • 创建了一个 RemoteControl 对象,并将这两个具体命令对象分别与槽位 1 和槽位 2 关联。
    • 通过按下不同槽位的按钮来测试遥控器。按下槽位 1 会打印 “Light is on”,按下槽位 2 会打印 “Light is off”。

这段代码演示了如何使用命令模式来实现一个简单的遥控器系统,其中遥控器的按钮与具体的操作(命令)相关联,从而实现了解耦和可扩展性。

image-20240326011159505

9. 状态模式(State Pattern)

状态模式允许对象在其内部状态改变时改变其行为,使对象看起来好像修改了其类。

from abc import ABC, abstractmethodclass State(ABC):@abstractmethoddef handle(self):passclass StateContext:def __init__(self, state):self._state = statedef set_state(self, state):self._state = statedef request(self):self._state.handle()class ConcreteStateA(State):def handle(self):print("Handling request in State A")# State A transitions to State Bcontext.set_state(ConcreteStateB())class ConcreteStateB(State):def handle(self):print("Handling request in State B")# State B transitions to State Acontext.set_state(ConcreteStateA())# 示例
context = StateContext(ConcreteStateA())
context.request()  # Output: Handling request in State A
context.request()  # Output: Handling request in State B

10. 中介者模式(Mediator Pattern)

中介者模式用于减少对象之间的直接依赖关系,通过引入中介者对象来集中控制对象之间的交互。

class Mediator:def __init__(self):self._colleagues = []def add_colleague(self, colleague):self._colleagues.append(colleague)def send_message(self, message, colleague):for col in self._colleagues:if col != colleague:col.receive_message(message)class Colleague:def __init__(self, mediator):self._mediator = mediatordef send_message(self, message):self._mediator.send_message(message, self)def receive_message(self, message):print(f"Received message: {message}")# 示例
mediator = Mediator()
colleague1 = Colleague(mediator)
colleague2 = Colleague(mediator)mediator.add_colleague(colleague1)
mediator.add_colleague(colleague2)colleague1.send_message("Hello from colleague 1")
colleague2.send_message("Hi from colleague 2")# Output:
# Received message: Hello from colleague 1
# Received message: Hi from colleague 2

这段代码展示了中介者模式(Mediator Pattern)的实现,该模式用于减少对象之间的直接通信,而是通过一个中介对象来协调对象之间的交互。现在让我们解析代码:

  1. Mediator 类:

    • __init__ 方法初始化了一个空列表 _colleagues,用于存储参与通信的同事对象。
    • add_colleague 方法用于向中介者中添加同事对象。
    • send_message 方法用于发送消息给其他同事对象,它会遍历 _colleagues 列表,并调用每个同事对象的 receive_message 方法,除了消息的发送者自身。
  2. Colleague 类:

    • __init__ 方法接受一个中介者对象作为参数,并将其保存在 _mediator 属性中。
    • send_message 方法用于向中介者发送消息,它将消息和发送者自身作为参数传递给中介者的 send_message 方法。
    • receive_message 方法用于接收来自中介者的消息,并打印消息内容。
  3. 示例:

    • 创建了一个 Mediator 对象。
    • 创建了两个 Colleague 对象,并将它们注册到中介者中。
    • 同事对象通过调用自己的 send_message 方法来发送消息给其他同事对象,实际上是通过中介者来进行通信。
    • 两个同事对象收到了对方发送的消息,并打印出来。

通过中介者模式,对象之间的通信被解耦,每个对象只需与中介者对象通信,而不需要直接与其他对象通信,从而降低了对象之间的耦合度,提高了系统的可维护性和扩展性。

image-20240326011420376

适配器模式(Adapter Pattern)

适配器模式是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。在软件开发中,经常会遇到需要使用已有的类,但是其接口与所需接口不匹配的情况。这时候就可以使用适配器模式来解决这一问题。

例如,假设有一个现有的类提供了特定功能,但是其方法命名或参数形式与新的需求不匹配。为了在不修改原有类的情况下与新的需求兼容,可以创建一个适配器类,该适配器类将新的需求接口转换为现有类的接口。

适配器模式通常包括三个角色:

  1. 目标接口(Target):客户端所期待的接口,适配器会实现这个接口。
  2. 适配者类(Adaptee):已经存在的类,其中包含客户端希望使用的功能,但其接口与目标接口不匹配。
  3. 适配器类(Adapter):通过实现目标接口并持有适配者对象,将客户端的请求转发给适配者对象。

适配器模式的优点包括:

  • 使得客户端能够使用已有的类,无需修改原有代码。
  • 提高代码的复用性和灵活性,适配器将现有类与新的需求解耦。

然而,适配器模式也有一些缺点:

  • 增加了系统的复杂性,引入了额外的类和对象。
  • 过多的适配器可能导致系统难以维护和理解。

在设计和应用适配器模式时,需要根据具体情况权衡利弊,确保使用适配器的同时保持代码的清晰和简洁。

外观模式(Facade Pattern)

外观模式是一种结构型设计模式,旨在为复杂系统提供一个简化的接口,以便客户端更容易地使用系统。在软件开发中,经常会遇到需要访问多个子系统或复杂接口的情况,这时候可以使用外观模式来隐藏系统的复杂性,提供一个统一的接口供客户端使用。

外观模式通常包括以下角色:

  1. 外观类(Facade):为客户端提供简单的接口,隐藏了子系统的复杂性,负责处理客户端的请求并将其委派给子系统处理。
  2. 子系统(Subsystem):包含多个相关的类或模块,负责实现系统的各种功能。

外观模式的优点包括:

  • 简化了客户端的调用过程,减少了客户端与子系统之间的耦合度。
  • 提高了代码的可维护性和可扩展性,客户端无需了解子系统的内部实现细节。

然而,外观模式也有一些缺点:

  • 过度使用外观模式可能导致系统的接口过于臃肿,难以维护。
  • 外观类成为了系统的唯一入口,一旦外观类出现问题,整个系统的功能都将受到影响。

在设计和应用外观模式时,需要根据系统的复杂性和需求来决定是否使用,以及如何设计外观类的接口,以确保系统的易用性和可维护性。

image-20240326011705094

总结

设计模式在软件开发中起着至关重要的作用,它们为开发人员提供了解决常见问题的有效工具和方法。本文介绍了两种常见的设计模式:适配器模式和外观模式。

适配器模式允许将一个类的接口转换成客户端所期望的另一个接口,从而使得原本不兼容的接口能够一起工作。通过适配器模式,我们可以在不修改原有类的情况下,使其与新的需求兼容,提高了代码的复用性和灵活性。

外观模式为复杂系统提供了一个简化的接口,隐藏了系统内部的复杂性,使客户端能够更轻松地使用系统。通过外观模式,我们可以将多个子系统或复杂接口封装起来,提供一个统一的接口给客户端,减少了客户端与子系统之间的耦合度,提高了代码的可维护性和可扩展性。

综上所述,设计模式是软件开发中不可或缺的一部分,它们为开发人员提供了解决问题的方法和思路,能够帮助我们编写更具有可读性、可维护性和可扩展性的代码。在实际项目中,根据具体需求和场景选择合适的设计模式,并结合最佳实践,将有助于开发出高质量的软件产品。

相关文章:

Python中的设计模式与最佳实践【第166篇—设计模式】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的设计模式与最佳实践 在软件开发中,设计模式是一种解决常见问题的经过…...

Python赋能AI数据分析开启人工智能新时代

文章目录 一、Python是办公自动化的重要工具二、Python是提升职场竞争力的利器三、Python是企业数字化的重要平台四、Python是AI发展的重要通道之一《编程菜鸟学Python数据分析》编辑推荐内容简介作者简介目录前言为什么要写这本书读者对象如何阅读本书 随着我国企业数字化和信…...

TP5使用group报错:1055 Expression #1 of SELECT list is not in GROUP

使用group报错 Mysql环境是5.7的, 使用了View进行了表连接, 进行了表连接 搬迁到本地后, 查询报错 Syntax error or access violation: 1055 Expression 解决方法1 配置 my.cnf(linux)文件 win下面是 mysql.ini文件 在 mysqld 里加上 sql_modeNO_ENGINE_SUBSTITUTION,STR…...

SQL-DML数据操纵语言(Oracle)

文章目录 DML数据操纵语言常见的字段属性字符型字段属性char(n)varchar2(n)/varchar(n) 数值型字段属性number([p],[s]int 日期型字段属性DATEtimestamp 如何查看字段属性增加数据INSERT快捷插入 删除数据DELETE修改数据UPDATE DML数据操纵语言 定义 是针对数据做处理&#xf…...

springboot+axios传参问题

目录 get请求方式: 不携带参数: 携带参数 第一种方式: 第二种传参方式: post方式: 携带参数: 第一种方式: 第二种方式:...

(BERT蒸馏)TinyBERT: Distilling BERT for Natural Language Understanding

文章链接:https://arxiv.org/abs/1909.10351 背景 在自然语言处理(NLP)领域,预训练语言模型(如BERT)通过大规模的数据训练,已在多种NLP任务中取得了卓越的性能。尽管BERT模型在语言理解和生成…...

【数据结构|C语言版】双向链表

前言1. 初步认识双向链表1.1 定义1.2 结构1.3 储存 2. 双向链表的方法(接口函数)2.1 动态申请空间2.2 创建哨兵位2.3 查找指定数据2.4 指定位置插入2.5 指定位置删除2.6 头部插入2.7 头部删除2.8 尾部插入2.9 尾部删除2.10 计算链表大小2.11 销毁链表 3.…...

适用于 Windows 的 10 个顶级 PDF 编辑器 [免费和付费]

曾经打开PDF文件,感觉自己被困在数字迷宫中吗?无法编辑的文本、无法调整大小的图像以及签署感觉像是一件苦差事的文档?好吧,不用再担心了!本指南解开了在 Windows 上掌握 PDF 的秘密,其中包含 10 款适用于 …...

久菜盒子|留学|推荐信|活动类|改性伽马-三氧化二铝催化剂上甲醇制备二甲醚的研究项目

尊敬的录取委员会: 我是华东理工大学化工学院的刘殿华。非常荣幸在此推荐我校优秀学生 XXX 进入贵校学习。 我认识 XXX是在一年前,当时,我正计划做一个有关改性伽马-三氧化二铝催化剂上甲醇制备二甲醚的研究项目。XXX 找到了我,表示希望能够加…...

Java项目如何使用EasyExcel插件对Excel数据进行导入导出

文章目录 一、EasyExcel的示例导入依赖创建实体类数据导入和导出 二、EasyExcel的作用三、EasyExcel的注解 EasyExcel是一个阿里巴巴开源的excel处理框架,它以使用简单、节省内存著称。在解析Excel时,EasyExcel没有将文件数据一次性全部加载到内存中&…...

python标准库常用方法集合

前段时间准备第十五届蓝桥杯python a组,因为赛中不允许导包,因此对py中的标准库进行了笔记和总结,即不导包即可使用的常用方法。包含了内置函数、math、random、datetime、os、sys、re、queue、collections、itertools库的常用方法&#xff0…...

智谱AI通用大模型:官方开放API开发基础

目录 一、模型介绍 1.1主要模型 1.2 计费单价 二、前置条件 2.1 申请API Key 三、基于SDK开发 3.1 Maven引入SDK 3.2 代码实现 3.3 运行代码 一、模型介绍 GLM-4是智谱AI发布的新一代基座大模型,整体性能相比GLM3提升60%,支持128K上下文&#x…...

单片机家电产品--OC门电路

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 单片机家电产品–OC门电路 前言 记录学习单片机家电产品内容 已转载记录为主 一、知识点 1OC门电路和OD门电路的区别 OC门电路和OD门电路的区别 OC门:三极管…...

gcc常用命令指南(更新中...)

笔记为gcc常用命令指南(自用),用到啥方法就具体研究一下,更新进去... 编译过程的分布执行 64位系统生成32位汇编代码 gcc -m32 test.c -o test -m32用于生成32位汇编语言...

【深度学习】【机器学习】用神经网络进行入侵检测,NSL-KDD数据集,基于机器学习(深度学习)判断网络入侵,网络攻击,流量异常【3】

之前用NSL-KDD数据集做入侵检测的项目是: 【1】https://qq742971636.blog.csdn.net/article/details/137082925 【2】https://qq742971636.blog.csdn.net/article/details/137170933 有人问我是不是可以改代码,我说可以。 训练 我将NSL_KDD_Final_1.i…...

两步解决 Flutter Your project requires a newer version of the Kotlin Gradle plugin

在开发Flutter项目的时候,遇到这个问题Flutter Your project requires a newer version of the Kotlin Gradle plugin 解决方案分两步: 1、在android/build.gradle里配置最新版本的kotlin 根据提示的kotlin官方网站搜到了Kotlin的最新版本是1.9.23,如下图所示: 同时在Ko…...

ArcGIS加载的各类地图怎么去除服务署名水印

昨天介绍的: 一套图源搞定!清新规划底图、影像图、境界、海洋、地形阴影图、导航图-CSDN博客文章浏览阅读373次,点赞7次,收藏11次。一体化集成在一起的各类型图源,比如包括影像、清新的出图底图、地形、地图阴影、道路…...

AttributeError: module ‘cv2.face’ has no attribute ‘LBPHFaceRecognizer_create’

问题描述: 报错如下: recognizer cv2.face.LBPHFaceRecognizer_create() AttributeError: module ‘cv2.face’ has no attribute ‘LBPHFaceRecognizer_create’ 解决方案: 把opencv-python卸载了,然后安装ope…...

配置路由器实现互通

1.实验环境 实验用具包括两台路由器(或交换机),一根双绞线缆,一台PC,一条Console 线缆。 2.需求描述 如图6.14 所示,将两台路由器的F0/0 接口相连,通过一台PC 连接设备的 Console 端口并配置P地址(192.1…...

Google Guava第五讲:本地缓存实战及踩坑

本地缓存实战及踩坑 本文是Google Guava第五讲,先介绍为什么使用本地缓存;然后结合实际业务,讲解如何使用本地缓存、清理本地缓存,以及使用过程中踩过的坑。 文章目录 本地缓存实战及踩坑1、缓存系统概述2、缓存架构演变2.1、无缓存架构2.2、引入分布式缓存问题1:为什么选…...

一个文生视频MoneyPrinterTurbo项目解析

最近抖音剪映发布了图文生成视频功能,同时百家号也有这个功能,这个可以看做是一个开源的实现,一起看看它的原理吧~ 一句话提示词 大模型生成文案 百家号生成视频效果 MoneyPrinterTurbo生成视频效果 天空为什么是蓝色的? 天空之所以呈现蓝色,是因为大气中的分子和小粒子会…...

智能商品计划系统如何提升鞋服零售品牌的竞争力

国内鞋服零售企业经过多年的发展,已经形成了众多知名品牌,然而近年来一些企业频频受到库存问题的困扰,这一问题不仅影响了品牌商自身,也给长期合作的经销商带来了困扰。订货会制度在初期曾经有效地解决了盲目生产的问题&#xff0…...

OpenHarmony开发案例:【分布式遥控器】

1.概述 目前家庭电视机主要通过其自带的遥控器进行操控,实现的功能较为单一。例如,当我们要在TV端搜索节目时,电视机在遥控器的操控下往往只能完成一些字母或数字的输入,而无法输入其他复杂的内容。分布式遥控器将手机的输入能力…...

如何将Oracle 中的部分不兼容对象迁移到 OceanBase

本文总结分析了 Oracle 迁移至 OceanBase 时,在出现三种不兼容对象的情况时的处理策略以及迁移前的预检方式,通过提前发现并处理这些问题,可以有效规避迁移过程中的报错风险。 作者:余振兴,爱可生 DBA 团队成员&#x…...

Python也可以合并和拆分PDF,批量高效!

PDF是最方便的文档格式,可以在任何设备原样且无损的打开,但因为PDF不可编辑,所以很难去拆分合并。 知乎上也有人问,如何对PDF进行合并和拆分? 看很多回答推荐了各种PDF编辑器或者网站,确实方法比较多。 …...

python笔记(14)迭代器和生成器

迭代器的优势 延迟计算:迭代器按需提供数据,无需一次性加载整个数据集到内存中,特别适合处理大规模或无限数据流。资源效率:减少内存占用,尤其在处理大量数据时,避免一次性构建完整数据结构带来的开销。统…...

简单3步,OpenHarmony上跑起ArkUI分布式小游戏

标准系统新增支持了方舟开发框架(ArkUI)、分布式组网和 FA 跨设备迁移能力等新特性,因此我们结合了这三种特性使用 ets 开发了一款如下动图所示传炸弹应用。 打开应用在通过邀请用户进行设备认证后,用户须根据提示完成相应操作&am…...

GPT-3和自然语言处理的前沿:思考AI大模型的发展

引言 自然语言处理(NLP)是人工智能(AI)领域中最富有挑战性和活跃的研究领域之一。近年来,随着深度学习技术的发展和计算能力的提高,大型语言模型,尤其是OpenAI的GPT-3,已成为推动该…...

傅里叶变换例题

目录 傅里叶转化例题: 时移 频移 尺度 时域卷积性质:卷积==乘机...

基于Docker构建CI/CD工具链(六)使用Apifox进行自动化测试

添加测试接口 在Spring Boot Demo项目里实现一个简单的用户管理系统的后端功能。具体需求如下: 实现了一个RESTful API,提供了以下两个接口 : POST请求 /users:用于创建新的用户。GET请求 /users:用于获取所有用户的列…...

如何免费建一个网站/济南做网站建设的公司

随着Java8的发布,Oracle同时推出了一套全新的时间API,算是填坑吧。旧版本时间API的坑相信大家也早有耳闻:SimpleDateFormat是线程不安全的,多线程环境下共用同一个Formatter可能会抛异常month被设计得非常奇葩,用0~11表…...

wordpress怎么进入后台/怎么看百度关键词的搜索量

XLWT简单描述: xlwt为python第三方模块,用来写excel 安装:pip install xlwt 使用:在py模块中 import xlwtpip list查询电脑中已安装的模块 EXCLE写入步骤简述: 1.创建工作簿wb2.创建工作表sheet3.填充工作表shee…...

福建省住房和城乡建设部网站/域名免费注册

文章概述: 一、逻辑卷存储概念 二、逻辑卷管理器 三、管理物理卷 四、管理卷组 AIX的存储管理和逻辑卷管理(Logical Volume Management,LVM) 一、逻辑卷存储概念 五个基本的逻辑卷存储概念:物理卷(PV&am…...

平谷手机网站设计/百度官网网页版

腾讯云HTTPS解决方案:腾讯云针对现有用户,提供HTTPS的安全加密方案。腾讯云HTTPS有两种解决方法:客户自带证书和腾讯提供域名和证书。 腾讯云HTTPS解决方法客户提供证书和私钥,托管至腾讯云。 此种方案需要客户提供自带证书&am…...

2345网址导航中国最好/优化seo

目录1、Database2、创建表2.1建表语法2.2内部表2.3外部表2.4分区表2.5临时表2.6 CTAS创建表2.7 CTE创建表2.8 like复制表结构3、修改表3.1 重命名表3.2 修改列3.3 新增列4、删除表5、显示命令6、装载数据6.1 put6.2 insert6.3 load6.4 import1、Database 表的集合,H…...

元谋网站建设/如何在百度上添加自己的店铺

su 切换到root用户,但是并没有转到root用户家目录下,即没有改变用户的环境。 su - 切换到root用户,并转到root用户的家目录下,即改变到了root用户的环境。 这个涉及到不同用户下的环境变量的配置。 sudo 通过sudo,我们…...