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

Python 10天冲刺 《元编程(Meta-programming)》

Python 的元编程(Meta-programming)是指在程序运行期间动态生成、修改或操作代码的技术。它允许开发者通过代码控制代码的行为,从而实现灵活、可扩展和抽象化的编程模式。Python 提供了多种元编程工具,包括装饰器、元类、动态导入、AST 操作等,这些技术在框架开发(如 ORM、Web 框架)、代码生成、AOP(面向切面编程)等领域广泛应用。


1. 元编程的核心思想

  • 核心思想
    在运行时动态修改或生成代码,通过程序自身控制其行为。
  • 应用场景
    • 统一类或函数的行为(如日志、计时、权限验证)。
    • 动态创建类或对象。
    • 自动化代码生成(如 ORM 框架生成 SQL 语句)。
    • 实现设计模式(如单例模式、代理模式)。

2. 常见元编程技术详解

2.1 装饰器(Decorators)
  • 作用
    动态修改函数或方法的行为,无需修改其源代码。
  • 语法
    @decorator 语法糖,本质是函数或类的包装器。

示例:日志装饰器

def log_decorator(func):def wrapper(*args, **kwargs):print(f"Calling {func.__name__}")return func(*args, **kwargs)return wrapper@log_decorator
def add(a, b):return a + badd(2, 3)  # 输出:Calling add

高级用法

  • 带参数的装饰器
    def repeat(n):def decorator(func):def wrapper(*args, **kwargs):for _ in range(n):func(*args, **kwargs)return wrapperreturn decorator@repeat(3)
    def greet():print("Hello")greet()  # 输出:Hello 三次
    

2.2 元类(Metaclasses)
  • 作用
    控制类的创建过程(即 type 或自定义元类)。
  • 核心
    元类是类的类,通过继承 type 或重写 __new__/__init__ 方法实现。

示例:强制类名大写

class Meta(type):def __new__(cls, name, bases, attrs):# 检查类名是否全大写if not name.isupper():raise TypeError("Class name must be uppercase")return super().__new__(cls, name, bases, attrs)class MyClass(metaclass=Meta):pass  # 通过class my_class(metaclass=Meta):pass  # 抛出错误:Class name must be uppercase

应用场景

  • 统一所有子类的初始化行为。
  • 自动注册类到某个全局字典(如 Django 模型注册)。
  • 验证类定义的合法性(如接口规范)。

2.3 动态导入与反射(Dynamic Import & Reflection)
  • 动态导入
    在运行时加载模块或对象。
  • 反射
    通过字符串名称获取对象(如 getattr, hasattr)。

示例:动态加载类

def create_instance(module_name, class_name):module = __import__(module_name)cls = getattr(module, class_name)return cls()# 假设存在 module_a.py 中的类 A
obj = create_instance("module_a", "A")
obj.some_method()

2.4 动态属性与描述符(Descriptors)
  • 动态属性
    通过 __getattr____setattr__ 等魔术方法实现。
  • 描述符
    定义属性访问行为,通过 __get____set__ 等方法控制。

示例:只读属性

class ReadOnlyDescriptor:def __init__(self, value):self.value = valuedef __get__(self, instance, owner):return self.valuedef __set__(self, instance, value):raise AttributeError("Cannot set read-only attribute")class MyClass:attr = ReadOnlyDescriptor(10)obj = MyClass()
print(obj.attr)  # 输出:10
obj.attr = 20    # 抛出错误:Cannot set read-only attribute

2.5 AST 操作(Abstract Syntax Tree)
  • 作用
    解析和修改 Python 代码的抽象语法树(AST)。
  • 模块
    使用 ast 模块分析或生成代码。

示例:统计代码中的变量名

import astclass VariableCounter(ast.NodeVisitor):def __init__(self):self.variables = set()def visit_Name(self, node):if isinstance(node.ctx, ast.Store):  # 变量赋值self.variables.add(node.id)self.generic_visit(node)code = """
a = 1
b = a + 2
"""
tree = ast.parse(code)
visitor = VariableCounter()
visitor.visit(tree)
print(visitor.variables)  # 输出:{'a', 'b'}

2.6 类工厂与动态类(Class Factories)
  • 作用
    在运行时动态创建类。
  • 实现
    通过 type() 函数或 class 语句生成。

示例:动态创建计算器类

def create_calculator(name, operation):return type(name, (), {"calculate": lambda self, a, b: operation(a, b)})Adder = create_calculator("Adder", lambda a, b: a + b)
Multiplier = create_calculator("Multiplier", lambda a, b: a * b)print(Adder().calculate(2, 3))      # 输出:5
print(Multiplier().calculate(2, 3)) # 输出:6

2.7 单例模式(Singleton)
  • 实现
    通过元类或装饰器确保一个类只有一个实例。

示例:用元类实现单例

class SingletonMeta(type):_instances = {}def __call__(cls, *args, **kwargs):if cls not in cls._instances:cls._instances[cls] = super().__call__(*args, **kwargs)return cls._instances[cls]class Singleton(metaclass=SingletonMeta):passs1 = Singleton()
s2 = Singleton()
print(s1 is s2)  # 输出:True

2.8 Borg 模式(Monostate)
  • 特点
    所有实例共享同一状态(而非同一个实例)。

示例

class Borg:_shared_state = {}def __init__(self):self.__dict__ = self._shared_stateclass MyBorg(Borg):def __init__(self, value):super().__init__()self.value = valueb1 = MyBorg(10)
b2 = MyBorg(20)
print(b1.value, b2.value)  # 输出:20 20(因为 b1 的 value 被覆盖)

3. 元编程的高级技巧

3.1 AOP(面向切面编程)
  • 实现
    通过装饰器或元类实现横切关注点(如日志、事务管理)。

示例:事务装饰器

def transaction(func):def wrapper(*args, **kwargs):try:result = func(*args, **kwargs)print("Commit transaction")return resultexcept Exception:print("Rollback transaction")raisereturn wrapper@transaction
def database_operation():# 模拟数据库操作pass

3.2 ORM(对象关系映射)
  • 核心思想
    将类映射到数据库表,通过元类或装饰器实现字段到列的绑定。

简化示例

class Field:def __init__(self, name, column_type):self.name = nameself.column_type = column_typeclass ModelMeta(type):def __new__(cls, name, bases, attrs):mappings = {}for k, v in attrs.items():if isinstance(v, Field):mappings[k] = vdel attrs[k]attrs["__mappings__"] = mappingsreturn super().__new__(cls, name, bases, attrs)class Model(metaclass=ModelMeta):def save(self):fields = ", ".join(self.__mappings__.keys())values = [getattr(self, k) for k in self.__mappings__]print(f"INSERT INTO {self.__class__.__name__} ({fields}) VALUES {tuple(values)}")class User(Model):name = Field("name", "VARCHAR(100)")age = Field("age", "INTEGER")user = User()
user.name = "Alice"
user.age = 30
user.save()  # 输出:INSERT INTO User (name, age) VALUES ('Alice', 30)

3.3 自动注册组件
  • 场景
    在框架中自动注册插件或组件(如 Django 的模型注册)。

示例

registry = {}def register_plugin(cls):registry[cls.__name__] = clsreturn cls@register_plugin
class PluginA:pass@register_plugin
class PluginB:passprint(registry)  # 输出:{'PluginA': <class 'PluginA'>, 'PluginB': <class 'PluginB'>}

4. 元编程的注意事项

  1. 可读性与可维护性
    过度使用元编程可能导致代码难以理解(如嵌套装饰器、复杂的元类逻辑)。
  2. 性能
    动态生成代码可能引入性能开销(如 AST 操作)。
  3. 调试难度
    元编程错误(如装饰器顺序、元类冲突)可能难以定位。
  4. 安全风险
    动态执行代码(如 evalexec)可能引发安全漏洞。

5. 元编程的典型应用场景

场景技术用途
框架开发元类、装饰器自动注册组件、ORM 映射、AOP
代码生成AST、类工厂生成配置文件、SQL 语句
API 设计描述符、属性实现属性验证、只读属性
插件系统动态导入、装饰器实现可扩展的插件机制
调试与监控装饰器、元类添加日志、性能计时

6. 总结

Python 的元编程技术提供了强大的灵活性和抽象能力,适用于需要动态修改或生成代码的场景。然而,需权衡其复杂性和可维护性,避免滥用。核心思想是:用代码控制代码的行为,从而实现更简洁、高效的解决方案。

通过合理使用装饰器、元类、AST 操作等技术,可以大幅提升代码的复用性和扩展性,这也是 Python 成为“胶水语言”和框架首选语言的重要原因之一。

相关文章:

Python 10天冲刺 《元编程(Meta-programming)》

Python 的元编程&#xff08;Meta-programming&#xff09;是指在程序运行期间动态生成、修改或操作代码的技术。它允许开发者通过代码控制代码的行为&#xff0c;从而实现灵活、可扩展和抽象化的编程模式。Python 提供了多种元编程工具&#xff0c;包括装饰器、元类、动态导入…...

Android开发-创建、运行、调试App工程

在移动应用开发的世界里&#xff0c;Android平台凭借其开放性和广泛的设备支持&#xff0c;成为了许多开发者的选择。而要成为一名合格的Android开发者&#xff0c;掌握如何创建、运行以及调试应用程序是必不可少的基础技能。本文将详细介绍如何使用Android Studio完成这些任务…...

系统级编程(二):通过读取PE文件获取EXE或者DLL的依赖

PE文件 Windows的PE文件(Portable Executable)是一种专为Windows操作系统设计的标准可执行文件格式,用于存储和管理可执行程序、动态链接库(DLL)、驱动程序等二进制文件。PE文件格式自Windows NT 3.1引入以来,已成为Windows平台上所有可执行文件的标准格式,并广泛应用于…...

Linux主机时间设置操作指南及时间异常影响

一、Linux主机时间设置命令操作指南 1. 查看当前系统时间与时区 查看当前时间与时区&#xff1a;timedatectl # 显示详细时间与时区信息&#xff08;systemd系统适用&#xff09; date # 查看当前系统时间 hwclock --show # 查看硬件时…...

GPS定位方案

目录 一、常用的GPS定位方案包括&#xff1a; 二、主流品牌及热销型号 三、常用GPS算法及核心逻辑&#xff1a; 一、基础定位算法 二、高精度算法 三、辅助优化算法 四、信号处理底层算法 四、基本原理&#xff08;想自己写算法的琢磨一下原理&#xff09; 一、常用的GP…...

应对联网汽车带来的网络安全挑战

数字化加速正在彻底改变全球各行各业,而汽车行业更是走在了前列。目前,全球自动驾驶汽车保有量约为4860万辆,预计到2024年将增长至5420万辆。 智能汽车的崛起无疑令人兴奋,但也带来了一系列问题。为了保护客户免受新的威胁,汽车行业必须做出一系列考量:针对自动驾驶、网…...

人工智能与生命科学的深度融合:破解生物医学难题,引领未来科技革命

引言 随着人工智能技术的飞速发展&#xff0c;生命科学领域迎来了前所未有的变革。从药物研发到疾病预测&#xff0c;从个性化医疗到基因组学&#xff0c;AI的深度融入不仅加速了生物医学的进步&#xff0c;还在多个领域打破了传统科学研究的局限&#xff0c;开创了新的医学前沿…...

DeepSeek智能时空数据分析(七):4326和3857两种坐标系有什么区别?各自用途是什么?

序言&#xff1a;时空数据分析很有用&#xff0c;但是GIS/时空数据库技术门槛太高 时空数据分析在优化业务运营中至关重要&#xff0c;然而&#xff0c;三大挑战仍制约其发展&#xff1a;技术门槛高&#xff0c;需融合GIS理论、SQL开发与时空数据库等多领域知识&#xff1b;空…...

Qt/C++面试【速通笔记七】—Qt中为什么new QWidget不需要手动调用delete?

在Qt的开发中&#xff0c;管理内存是一个非常重要的话题&#xff0c;特别是在使用QWidget这类窗口组件时&#xff0c;很多开发者会遇到一个问题&#xff1a;“为什么我使用new QWidget创建的窗口对象不需要手动调用delete进行销毁&#xff1f;”。 1. 父子关系机制&#xff1a;…...

Super-vlan

Super VLAN&#xff08;VLAN聚合&#xff09;的理论与配置 1. 基本概念 Super VLAN&#xff08;超级VLAN&#xff09;是一种VLAN聚合技术&#xff0c;主要用于解决传统VLAN划分中IP地址浪费的问题。其核心思想是将多个Sub VLAN&#xff08;子VLAN&#xff09;聚合到一个Super …...

C——函数

一、函数的概念 数学中我们其实就⻅过函数的概念&#xff0c;⽐如&#xff1a;⼀次函数 y kx b &#xff0c;k和b都是常数&#xff0c;给⼀个任意的 x&#xff0c;就得到⼀个y值。 其实在C语⾔也引⼊函数&#xff08;function&#xff09;的概念&#xff0c;有些翻译为&…...

5.6刷题并查集

P1551 亲戚 #include<bits/stdc.h> using namespace std; const int N 5010; int f[N]; int find(int x){if(f[x] x)return x;return f[x] find(f[x]); } void solve(){int n, m, p; cin >> n >> m >> p;for(int i 1; i < n; i)f[i] i;for(in…...

pcl平面投影

// 创建一个系数为XY0,Z1的平面pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ());coefficients->values.resize (4);coefficients->values[0] coefficients->values[1] 0;coefficients->values[2] 1.0;coefficients->values[3] 0…...

Linux远程管理

如何查看ip 如何使用vim编辑器 如何设置网络信息 远程访问 一&#xff1a;网络管理 &#xff08;1&#xff09;获取计算机的网络信息 基本语法&#xff1a; windows ipconfig ifconfig enS33: f1agS4163<UP,BR0ADCAST,RUNNING,MULTICAST> mtu 1500 inet…...

如何添加或删除极狐GitLab 项目成员?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 项目成员 (BASIC ALL) 成员是有权访问您的项目的用户和群组。 每个成员都有一个角色&#xff0c;这决定了他们在项目中可以…...

2025年服务器技术全景解析:量子计算、液冷革命与未来生态构建

2025年服务器技术全景解析&#xff1a;量子计算、液冷革命与未来生态构建 一、量子计算&#xff1a;从实验室到产业化的跨越 1. 中国量子计算产业化突破 • 本源量子“悟空”超导计算机&#xff1a; 搭载72位自主超导量子芯片“悟空芯”&#xff0c;支持198个量子比特…...

Vue3+ Vite + Element-Plus + TypeScript 从0到1搭建

一环境准备 二vite 项目初始化 按照 &#x1f343;Vite 官方文档 - 搭建第一个 Vite 项目 说明&#xff0c;执行以下命令完成 vue 、typescirpt 模板项目的初始化 npm init vitelatest vue3-element-admin --template vue-tsvue3-element-admin: 自定义的项目名称 vue-ts &am…...

如何对 Redis 进行水平扩展和垂直扩展以应对微服务流量的增长?

核心概念&#xff1a; 垂直扩展 (Scale Up): 提升单个节点的性能。简单来说就是给现有的 Redis 服务器增加更多的 CPU 、内存、更快的存储&#xff08;SSD&#xff09;或更高的网络带宽。水平扩展 (Scale Out): 增加更多节点来分担负载。这意味着部署多个 Redis 实例&#xff…...

PyCharm 加载不了 conda 虚拟环境,不存在的

#工作记录 前言 在开发过程中&#xff0c;PyCharm 无法加载 Conda 虚拟环境是常见问题。 在不同情况下&#xff0c;“Conda 可执行文件路径”的指定可能会发生变化&#xff0c;不会一尘不变&#xff0c;需要灵活处置。 以下是一系列解决此问题的经验参考。 检查 Conda 安装…...

Matlab/Simulink的一些功能用法笔记(4)

水一篇帖子 01--MATLAB工作区的保护眼睛颜色设置 默认的工作区颜色为白色 在网上可以搜索一些保护眼睛的RGB颜色参数设置 在MATLAB中按如下设置&#xff1a; ①点击预设 ②点击颜色&#xff0c;点击背景色的三角标符号 ③点击更多颜色&#xff0c;找到RGB选项 ④填写颜色参数…...

OS7.【Linux】基本指令入门(6)

目录 1.zip和unzip 配置指令 使用 两个名词:打包和压缩 打包 压缩 Linux下的操作演示 压缩和解压缩文件 压缩和解压缩目录 -d选项 2.tar Linux下的打包和压缩方案简介 czf选项 xzf选项 -C选项 tzf选项 3.bc 4.uname 不带选项的uname -a选项 -r选项 -v选项…...

便捷OCR文字识别软件推荐

软件介绍 此次要介绍的是一款OCR识别软件。 核心功能及特点 这款小巧的OCR识别软件&#xff0c;功能简洁&#xff0c;操作方便&#xff0c;只需进行截图&#xff0c;随后就能自动识别文字内容。并且&#xff0c;它具备离线使用的特性&#xff0c;这一特点使得它非常适合在不联…...

【中间件】brpc_基础_栈管理

文章目录 BRPC bthread栈管理1 简介2 关键数据结构2.1 栈描述符 (bthread_stack_t)2.2 栈池 (StackPool) 3 核心操作3.1 栈分配 (bthread_stack_alloc)3.2 栈释放 (bthread_stack_dealloc)3.3 栈切换支持 4 性能优化5 安全性设计6 跨平台实现6.1 Linux6.2 Windows 7 应用场景8 …...

Linux 硬盘和光驱系统管理

一、硬盘与目录的容量 [rootwww ~]# df [-ahikHTm] [目录或档名] 选项与参数&#xff1a; -a &#xff1a;列出所有的档案系统&#xff0c;包括系统特有的 /proc 等档案系统&#xff1b; -k &#xff1a;以 KBytes 的容量显示各档案系统&#xff1b; -m &#xff1a;以 MByt…...

分库分表后复杂查询的应对之道:基于DTS实时性ES宽表构建技术实践

1 问题域 业务发展的初期&#xff0c;我们的数据库架构往往是单库单表&#xff0c;外加读写分离来快速的支撑业务&#xff0c;随着用户量和订单量的增加&#xff0c;数据库的计算和存储往往会成为我们系统的瓶颈&#xff0c;业界的实践多数采用分而治之的思想&#xff1a;分库…...

[三分钟]性能测试工具JMeter入门: 下载安装JMeter并设置中文;JMeter基本使用流程

文章目录 1.下载并打开JMeter2.设置JMeter中文3.JMeter基本使用流程 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具。 JMeter 支持多种协议和技术&#xff0c;如 HTTP、HTTPS、FTP、JDBC、SOAP、REST、JMS 等。它不仅可以用于性能测试&#xff0c;还可以用于功能测…...

StableDiffusionWebUI的AI绘图AI绘视频详细使用教程+报错排坑

概述 这里是官方的最原始的体积最小的StableDiffusionWebUI的下载及其使用教程&#xff0c;已经帮你们把坑都排完了&#xff0c;本教程适合开发者、程序员自己折腾&#xff0c;源码体积只有1.8M。 从0安装到绘图 1.环境 Python与Git环境&#xff1a; 安装Python3.10.0 >…...

Flutter 合并 ‘dot-shorthands‘ 语法糖,Dart 开始支持交叉编译

最近在 Dart 在 main 3.9 合并了一项名为 「dot-shorthands」 的语法糖提议&#xff0c;该提议主要是为了简化开发过程中的相关静态固定常量的写法&#xff0c;通过上下文类型推断简化枚举值和静态成员的访问&#xff1a; 简单来说&#xff0c;就是在之前你可能需要写 SomeEnum…...

貌似我的ollama加载的模型被下载了两份?终于搞懂原理了。

文章目录 背景ollama的模型默认会被放在哪儿呢?什么是homedir?ollama服务直接ollama serve如何修改保存模型文件的路径?背景 如果你想以最快的方式,部署本地的大模型,那么ollama无疑是最合适的选择之一。我其实linux用的不多。之前一直是在windows上部署的ollama。后来有…...

【HarmonyOS 5】鸿蒙用户头像编辑功能实践

【HarmonyOS 5】鸿蒙用户头像编辑功能实践 一、前言 1、应用背景 在鸿蒙化开发过程中,我们发现最基本常见的功能–用户头像的编辑,实现方式和Android与IOS有极大的不同。 在实际开发和调研的过程中,我们发现并总结了鸿蒙隐私处理与业内Android和IOS的差异性。发现隐私保…...

VTK|结合qt创建通用按钮控制显隐(边框、坐标轴、点线面)

文章目录 增加边框BoundingBox添加addBoundingBox添加BoundingBox控制按钮点击按钮之后的槽函数 添加坐标轴增加点线面显隐控制按钮添加控制点线面显隐的按钮到三维显示界面控制面显示槽函数控制线显示槽函数控制点显示槽函数 增加边框BoundingBox 增加边框BoundingBox并通过按…...

Python Cookbook-7.3 在 Pickling 的时候压缩

任务 你想以一种压缩的方式来 pickle 一般的 Python 对象。 解决方案 标准库模块 cPickle 和 gzip提供了所需的功能;你只需以适当的方式将它们粘合起来即可: import cPickle,gzip def save(filename,*objects):将对象存为压缩过的磁盘文件fil gzip.open(filename,wb)for o…...

合并两个有序链表 - 简单

************* C topic: 21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; ************* Give the topic an inspection. Hi, guys, how is your holiday break? I went to 黄山 in the past few days. The mount Huang is really beautiful. 天都峰 is real…...

手写 Vue 源码 === Effect 机制解析

目录 核心概念 响应式效果的实现 依赖收集的具体流程 为什么使用全局变量&#xff1f; 嵌套 effect 的处理 总结 Vue3 的响应式系统核心在于跟踪依赖并在数据变化时触发更新。effect.ts文件实现了这一机制的核心部分&#xff0c;下面我们来梳理其中的关键思路。 核心概念…...

《AI大模型应知应会100篇》第49篇:大模型应用的成本控制策略

第49篇&#xff1a;大模型应用的成本控制策略 &#x1f9fe; 摘要 随着AI大模型的广泛应用&#xff0c;其高昂的部署与运行成本成为企业面临的一大挑战。本文将从技术架构、资源优化、业务模式等多个维度出发&#xff0c;系统性地讲解如何在保障服务质量的前提下&#xff0c;实…...

利用Ollama部署DeepSeek模型

利用Ollama部署DeepSeek模型 最近&#xff0c;DeepSeek作为一款高效的推理模型受到了广泛关注&#xff0c;但在使用网页版过程中&#xff0c;总是遇到服务器繁忙&#xff0c;因此尝试在本地部署DeepSeek来使用。 一、Ollama安装指南 Ollama是一个开源的AI大模型部署工具&…...

数字孪生储能充电站,实现智慧能源设施全景管控

图扑将储能充电站的电池组、充电桩、配电系统等设备进行数字孪生&#xff0c;通过实时接入充放电数据、设备状态及能耗信息&#xff0c;以三维可视化界面直观呈现储能动态、电力调度与运维场景&#xff0c;助力运营方优化资源配置、预判设备故障&#xff0c;推动储能充电设施高…...

MCP服务发展现状的有趣发现

MCP服务发展现状的有趣发现 当前&#xff0c;MCP&#xff08;Model Context Protocol&#xff09;在AI领域逐渐成为一个热门话题。其核心意义在于赋予大模型直接调用外部工具的能力&#xff0c;从而打破“数据孤岛”&#xff0c;实现真正的工具增强型AI。然而&#xff0c;在深…...

aws平台windows虚拟机扩容

收到aws平台windows虚拟机扩容磁盘的请求 登陆aws平台ec2找的对应的虚拟机 进入实例详情 然后点击存储 点击进入卷 然后远程登陆这台虚拟机 在运行对话框中&#xff0c;输入 diskmgmt.msc 并按 Enter。然后&#xff0c;磁盘管理实例程序随之打开 在 Disk Management 菜单上&am…...

QuecPython+Aws:快速连接亚马逊 IoT 平台

提供一个可接入亚马逊 Iot 平台的客户端&#xff0c;用于管理亚马逊 MQTT 连接和影子设备。 初始化客户端 Aws class Aws(client_id,server,port,keep_alive,ssl,ssl_params)参数&#xff1a; client_id (str) - 客户端唯一标识。server (str) - 亚马逊 Iot 平台服务器地址…...

从创业踩雷到依法解债:湖北理元理律师事务所的危机拆解逻辑

“本以为最坏结果是创业失败&#xff0c;没想到差点毁了家庭。”34岁的武汉宝妈李婷&#xff08;化名&#xff09;在咖啡厅里翻着厚厚的案件材料。因参与朋友奶茶店项目&#xff0c;她在网贷平台借款28万&#xff0c;却因合同漏洞陷入债务旋涡。本文将拆解专业机构处理此类案件…...

1、Kafka与消息队列核心原理详解

消息队列&#xff08;Message Queue, MQ&#xff09;作为现代分布式系统的基础组件&#xff0c;极大提升了系统的解耦、异步处理和削峰能力。本文以Kafka为例&#xff0c;系统梳理消息队列的核心原理、架构细节及实际应用。 Kafka 基础架构及术语关系图 术语简要说明 Produce…...

【Linux系统】线程安全

线程安全和重入问题 概念 线程安全&#xff1a;多个线程在访问共享资源时&#xff0c;能够正确地执行&#xff0c;不会相互干扰或破坏彼此的执行结果。一般而言&#xff0c;多个线程并发同一段只有局部变量的代码时&#xff0c;不会出现不同的结果。但是对全局变量或者静态变…...

什么是gitlab自动部署,怎么配置gitlab自动部署

在现代软件开发流程中,自动化部署是提高效率和确保软件质量的关键环节。GitLab作为一个强大的DevOps平台,提供了完整的自动部署工具,帮助开发团队实现代码从编写到生产的无缝转换。本文将详细解析GitLab的自动部署功能是什么,如何进行操作,以及这一功能的实用性评估,帮助…...

Android开发-工程结构

在进行Android应用开发时&#xff0c;了解并掌握项目的工程结构是非常重要的一步。一个典型的Android项目由多个模块组成&#xff0c;每个模块又包含不同的目录和文件&#xff0c;它们各自承担着特定的功能。本文将带你深入了解Android Studio生成的默认项目结构&#xff0c;并…...

典籍知识问答模块AI问答功能feedbackBug修改+添加对话名称修改功能

1.feedbackBug修改 由于原先定为enum类型&#xff0c;导致无法正常评价&#xff0c;一直报错Data truncated for column feedback at row 1&#xff0c;将其修改为varchar类型&#xff0c;而类型选择在代码中实现 QAService代码修改后如下&#xff1a; 2.添加对话名称修改功…...

极狐Gitlab 里程碑功能介绍

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 里程碑 (BASIC ALL) 极狐GitLab 中的里程碑是一种跟踪议题和合并请求的方法&#xff0c;这些请求是为了在特定时间段内实现更…...

信奥赛CSP-J复赛集训(DP专题)(37):P4170 [CQOI2007] 涂色

信奥赛CSP-J复赛集训&#xff08;DP专题&#xff09;&#xff08;37&#xff09;&#xff1a;P4170 [CQOI2007] 涂色 题目描述 假设你有一条长度为 5 5 5 的木板&#xff0c;初始时没有涂过任何颜色。你希望把它的 5 5 5 个单位长度分别涂上红、绿、蓝、绿、红色&#xff0c…...

代码随想录算法训练营第五十六天| 图论2—卡码网99. 岛屿数量(dfs bfs)

假期归来继续刷题&#xff0c;图论第二天&#xff0c;主要是进一步熟悉dfs 和 bfs 的运用。 99. 岛屿数量&#xff08;dfs&#xff09; 99. 岛屿数量 ACM模式还是需要练&#xff0c;不过现在输入输出的感觉已经比较熟悉了。首先是要按照输入搭建一个grid&#xff0c;然后有一…...

iOS开发架构——MVC、MVP和MVVM对比

文章目录 前言MVC&#xff08;Model - View - Controller&#xff09;MVP&#xff08;Model - View - Presenter&#xff09;MVVM&#xff08;Model - View - ViewModel&#xff09; 前言 在 iOS 开发中&#xff0c;MVC、MVVM、和 MVP 是常见的三种架构模式&#xff0c;它们主…...