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

Python OOP核心技巧:如何正确选择实例方法、类方法和静态方法

Python方法类型全解析:实例方法、类方法与静态方法的使用场景

    • 一、三种方法的基本区别
    • 二、访问能力对比表
    • 三、何时使用实例方法
      • 使用实例方法的核心场景:
      • 具体应用场景:
        • 1. 操作实例属性
        • 2. 对象间交互
        • 3. 实现特定实例的行为
    • 四、何时使用类方法
      • 使用类方法的核心场景:
      • 具体应用场景:
        • 1. 替代构造函数(工厂方法)
        • 2. 操作类变量(计数器、配置等)
        • 3. 创建与多个实例共享的功能
        • 4. 子类多态性
    • 五、何时使用静态方法
      • 使用静态方法的核心场景:
      • 具体应用场景:
        • 1. 辅助验证和检查
        • 2. 格式化和转换功能
        • 3. 工具函数
        • 4. 与系统或框架交互的辅助函数
    • 六、方法类型选择决策流程
    • 七、混合使用的实际案例
    • 八、总结
      • 使用实例方法的情况:
      • 使用类方法的情况:
      • 使用静态方法的情况:

一、三种方法的基本区别

首先,让我们通过一个简单示例明确三种方法的基本语法和区别:

class Example:count = 0  # 类变量:所有实例共享的计数器def __init__(self, name):self.name = name  # 实例变量:每个对象特有的名称属性Example.count += 1  # 每创建一个实例,计数器加1# 实例方法:第一个参数是self,代表实例本身def instance_method(self):"""实例方法:可访问实例属性和类属性"""print(f"这是实例方法,能访问:self.name={self.name}, self.__class__.count={self.__class__.count}")return "实例方法返回"# 类方法:第一个参数是cls,使用@classmethod装饰器@classmethoddef class_method(cls):"""类方法:接收类作为第一个参数,可直接访问类属性"""print(f"这是类方法,能访问:cls.count={cls.count}")return "类方法返回"# 静态方法:没有特殊的第一个参数,使用@staticmethod装饰器@staticmethoddef static_method():"""静态方法:不接收特殊的第一个参数,无法直接访问类或实例属性"""print("这是静态方法,不能直接访问类或实例的属性")return "静态方法返回"

二、访问能力对比表

方法类型装饰器第一个参数能否访问实例变量能否访问类变量能否在不创建实例的情况下调用
实例方法self✓(通过self.class
类方法@classmethodcls
静态方法@staticmethod

三、何时使用实例方法

使用实例方法的核心场景:

  1. 需要访问或修改实例状态
  2. 表示对象特有的行为
  3. 实现对象之间的交互

具体应用场景:

1. 操作实例属性
class BankAccount:def __init__(self, account_number, balance=0):self.account_number = account_number  # 账号:每个账户唯一的标识符self.balance = balance  # 余额:账户中的资金数量self.transactions = []  # 交易记录:存储所有交易历史# 实例方法:操作特定账户的余额def deposit(self, amount):"""存款方法:增加账户余额并记录交易"""if amount <= 0:raise ValueError("存款金额必须为正数")self.balance += amountself.transactions.append(f"存款: +{amount}")return self.balancedef withdraw(self, amount):"""取款方法:减少账户余额并记录交易"""if amount <= 0:raise ValueError("取款金额必须为正数")if amount > self.balance:raise ValueError("余额不足")self.balance -= amountself.transactions.append(f"取款: -{amount}")return self.balancedef get_statement(self):"""获取账单方法:生成账户状态报告"""statement = f"账号: {self.account_number}\n"statement += f"当前余额: {self.balance}\n"statement += "交易记录:\n"for transaction in self.transactions:statement += f"- {transaction}\n"return statement
2. 对象间交互
class Person:def __init__(self, name, age):self.name = name  # 姓名:人物的名称标识self.age = age  # 年龄:人物的年龄self.friends = []  # 朋友列表:存储该人物的所有朋友对象# 实例方法:处理对象间关系def add_friend(self, friend):"""添加朋友方法:建立双向的朋友关系"""if friend not in self.friends:self.friends.append(friend)# 建立双向关系:如果对方尚未将自己添加为朋友,则添加friend.add_friend(self) if friend != self else Nonedef introduce(self):"""自我介绍方法:生成包含朋友信息的介绍语"""if not self.friends:return f"我是{self.name}{self.age}岁,我还没有朋友。"friends_names = [friend.name for friend in self.friends]return f"我是{self.name}{self.age}岁,我的朋友有:{', '.join(friends_names)}"# 使用示例
alice = Person("Alice", 25)
bob = Person("Bob", 27)
alice.add_friend(bob)print(alice.introduce())  # 输出: 我是Alice,25岁,我的朋友有:Bob
print(bob.introduce())    # 输出: 我是Bob,27岁,我的朋友有:Alice
3. 实现特定实例的行为
class Shape:def __init__(self, color):self.color = color  # 颜色:形状的颜色属性# 实例方法:每个形状计算面积的方式不同def area(self):"""面积计算方法:由子类实现具体计算方式"""raise NotImplementedError("子类必须实现这个方法")def describe(self):"""描述方法:提供形状的基本描述"""return f"这是一个{self.color}的形状"class Circle(Shape):def __init__(self, color, radius):super().__init__(color)self.radius = radius  # 半径:圆的特有属性def area(self):"""圆面积计算方法:实现具体的面积计算逻辑"""import mathreturn math.pi * self.radius ** 2def describe(self):"""圆描述方法:重写父类方法,提供圆特有的描述"""return f"这是一个{self.color}的圆,半径为{self.radius}"class Rectangle(Shape):def __init__(self, color, width, height):super().__init__(color)self.width = width  # 宽度:矩形的宽度属性self.height = height  # 高度:矩形的高度属性def area(self):"""矩形面积计算方法:实现具体的面积计算逻辑"""return self.width * self.heightdef describe(self):"""矩形描述方法:重写父类方法,提供矩形特有的描述"""return f"这是一个{self.color}的矩形,宽{self.width},高{self.height}"

四、何时使用类方法

使用类方法的核心场景:

  1. 替代构造函数(工厂方法)
  2. 操作类变量
  3. 创建与类本身相关,而非具体实例的方法
  4. 定义子类可重写但仍需访问类属性的方法

具体应用场景:

1. 替代构造函数(工厂方法)
class Person:def __init__(self, first_name, last_name, age):self.first_name = first_name  # 名:人的名字self.last_name = last_name  # 姓:人的姓氏self.age = age  # 年龄:人的年龄@classmethoddef from_full_name(cls, full_name, age):"""从全名创建Person实例的工厂方法"""# 处理中文名字情况:李四 → 李(姓)、四(名)if " " in full_name:first_name, last_name = full_name.split(" ", 1)else:# 假设中文名字第一个字是姓,其余是名first_name = full_name[0]  # 姓last_name = full_name[1:]  # 名return cls(first_name, last_name, age)@classmethoddef from_birth_year(cls, first_name, last_name, birth_year):"""从出生年份创建Person实例的工厂方法"""import datetimecurrent_year = datetime.datetime.now().yearage = current_year - birth_yearreturn cls(first_name, last_name, age)def __str__(self):"""字符串表示方法:提供对象的可读性表示"""return f"{self.first_name} {self.last_name}, {self.age}岁"# 使用默认构造函数
p1 = Person("张", "三", 25)
print(p1)  # 输出: 张 三, 25岁# 使用替代构造函数
p2 = Person.from_full_name("李四", 30)
print(p2)  # 输出: 李 四, 30岁p3 = Person.from_birth_year("王", "五", 1990)
print(p3)  # 输出: 王 五, 34岁(2024年)
2. 操作类变量(计数器、配置等)
class Database:connections = 0  # 类变量:跟踪当前连接数max_connections = 5  # 类变量:最大允许连接数connection_pool = []  # 类变量:存储所有活跃连接的列表def __init__(self, name):"""初始化数据库连接"""if Database.connections >= Database.max_connections:raise RuntimeError("达到最大连接数限制")self.name = name  # 数据库名称:连接的标识符Database.connections += 1  # 增加连接计数Database.connection_pool.append(self)  # 添加到连接池print(f"创建到数据库{name}的连接,当前连接数: {Database.connections}")def __del__(self):"""析构方法:清理连接资源"""Database.connections -= 1  # 减少连接计数if self in Database.connection_pool:Database.connection_pool.remove(self)  # 从连接池移除print(f"关闭到数据库{self.name}的连接,当前连接数: {Database.connections}")@classmethoddef get_connection_count(cls):"""获取当前连接数的类方法"""return cls.connections@classmethoddef set_max_connections(cls, max_conn):"""设置最大连接数的类方法"""if max_conn <= 0:raise ValueError("最大连接数必须为正数")cls.max_connections = max_connprint(f"最大连接数已设置为: {cls.max_connections}")@classmethoddef get_connection_pool_info(cls):"""获取连接池信息的类方法"""return {"total": cls.connections,  # 当前连接总数"max": cls.max_connections,  # 最大允许连接数"available": cls.max_connections - cls.connections,  # 可用连接数"databases": [conn.name for conn in cls.connection_pool]  # 已连接的数据库列表}
3. 创建与多个实例共享的功能
class FileHandler:supported_formats = ['txt', 'csv', 'json']  # 类变量:支持的文件格式列表default_encoding = 'utf-8'  # 类变量:默认文件编码def __init__(self, filename):self.filename = filename  # 文件名:处理的文件路径self.content = None  # 内容:存储文件读取的内容def read(self):"""读取文件方法:从文件中读取内容"""with open(self.filename, 'r', encoding=self.default_encoding) as f:self.content = f.read()return self.content@classmethoddef get_supported_formats(cls):"""获取支持的文件格式:返回所有支持的格式列表"""return cls.supported_formats@classmethoddef add_supported_format(cls, format_name):"""添加支持的文件格式:扩展可处理的文件类型"""if format_name not in cls.supported_formats:cls.supported_formats.append(format_name)print(f"已添加对{format_name}格式的支持")@classmethoddef is_supported(cls, filename):"""检查文件格式支持:判断文件是否为支持的格式"""ext = filename.split('.')[-1].lower() if '.' in filename else ''return ext in cls.supported_formats@classmethoddef set_default_encoding(cls, encoding):"""设置默认编码:修改所有实例使用的默认编码"""cls.default_encoding = encodingprint(f"默认编码已设置为: {encoding}")
4. 子类多态性
class Animal:species_count = {}  # 类变量:存储各物种数量的字典def __init__(self, name):self.name = name  # 名称:动物的名字# 更新该物种的数量统计cls = self.__class__cls.register_animal()@classmethoddef register_animal(cls):"""注册一个新动物实例:增加该物种的计数"""cls_name = cls.__name__  # 获取具体子类的名称Animal.species_count[cls_name] = Animal.species_count.get(cls_name, 0) + 1@classmethoddef get_species_count(cls):"""获取特定物种的数量:返回当前类的实例计数"""return Animal.species_count.get(cls.__name__, 0)@classmethoddef get_all_species_stats(cls):"""获取所有物种统计:返回所有物种的数量信息"""return Animal.species_countclass Dog(Animal):"""狗类:Animal的子类"""passclass Cat(Animal):"""猫类:Animal的子类"""pass# 创建动物实例
d1 = Dog("旺财")
d2 = Dog("小黑")
c1 = Cat("咪咪")# 获取物种统计
print(f"狗的数量: {Dog.get_species_count()}")  # 输出: 狗的数量: 2
print(f"猫的数量: {Cat.get_species_count()}")  # 输出: 猫的数量: 1
print(f"所有物种统计: {Animal.get_all_species_stats()}")  # 输出: 所有物种统计: {'Dog': 2, 'Cat': 1}

五、何时使用静态方法

使用静态方法的核心场景:

  1. 与类相关但不需要访问类状态的辅助功能
  2. 不依赖于类或实例状态的纯功能
  3. 在类命名空间中组织相关功能
  4. 工具函数,但与类主题相关

具体应用场景:

1. 辅助验证和检查
class User:def __init__(self, username, email, password):# 先验证输入if not User.is_valid_username(username):raise ValueError("无效的用户名")if not User.is_valid_email(email):raise ValueError("无效的邮箱")if not User.is_strong_password(password):raise ValueError("密码强度不足")self.username = username  # 用户名:用户的登录标识self.email = email  # 邮箱:用户的电子邮件地址self._password = User.hash_password(password)  # 密码:经过哈希处理的密码存储@staticmethoddef is_valid_username(username):"""检查用户名是否有效:验证用户名格式"""import repattern = r'^[a-zA-Z0-9_]{3,20}$'  # 用户名规则:字母数字下划线,3-20个字符return bool(re.match(pattern, username))@staticmethoddef is_valid_email(email):"""检查邮箱是否有效:验证邮箱格式"""import repattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'  # 标准邮箱格式return bool(re.match(pattern, email))@staticmethoddef is_strong_password(password):"""检查密码是否足够强:验证密码复杂度"""if len(password) < 8:  # 检查长度return Falsehas_upper = any(c.isupper() for c in password)  # 检查是否包含大写字母has_lower = any(c.islower() for c in password)  # 检查是否包含小写字母has_digit = any(c.isdigit() for c in password)  # 检查是否包含数字return has_upper and has_lower and has_digit  # 返回密码强度检查结果@staticmethoddef hash_password(password):"""密码哈希处理:提供密码的安全存储方式"""import hashlibreturn hashlib.sha256(password.encode()).hexdigest()  # 使用SHA-256进行哈希def check_password(self, password):"""检查密码是否匹配:验证用户密码"""hashed = User.hash_password(password)  # 对输入密码进行哈希return hashed == self._password  # 比较哈希值
2. 格式化和转换功能
class DataProcessor:def __init__(self, data):self.data = data  # 数据:要处理的原始数据def process(self):"""处理数据方法:对实例数据进行处理"""# 处理数据...processed_data = self.datareturn processed_data@staticmethoddef csv_to_list(csv_string):"""CSV转列表:将CSV字符串解析为二维列表"""lines = csv_string.strip().split('\n')  # 按行分割return [line.split(',') for line in lines]  # 每行按逗号分割@staticmethoddef list_to_csv(data_list):"""列表转CSV:将二维列表转换为CSV字符串"""return '\n'.join(','.join(map(str, row)) for row in data_list)  # 合并行和列@staticmethoddef json_to_dict(json_string):"""JSON转字典:解析JSON字符串为Python字典"""import jsonreturn json.loads(json_string)  # 使用json模块解析@staticmethoddef dict_to_json(data_dict):"""字典转JSON:将Python字典序列化为JSON字符串"""import jsonreturn json.dumps(data_dict, indent=2)  # 使用json模块序列化,添加缩进@staticmethoddef format_timestamp(timestamp):"""格式化时间戳:将时间戳转换为可读日期时间"""import datetimedt = datetime.datetime.fromtimestamp(timestamp)  # 转换为datetime对象return dt.strftime("%Y-%m-%d %H:%M:%S")  # 格式化输出
3. 工具函数
class MathUtils:@staticmethoddef is_prime(n):"""判断质数:检查一个数是否为质数"""if n <= 1:  # 1和负数不是质数return Falseif n <= 3:  # 2和3是质数return Trueif n % 2 == 0 or n % 3 == 0:  # 排除能被2或3整除的数return Falsei = 5while i * i <= n:  # 只需检查到平方根if n % i == 0 or n % (i + 2) == 0:return Falsei += 6  # 优化:只检查6k±1的数return True@staticmethoddef gcd(a, b):"""最大公约数:计算两个数的最大公因数"""while b:  # 使用欧几里得算法a, b = b, a % breturn a@staticmethoddef lcm(a, b):"""最小公倍数:计算两个数的最小公倍数"""return a * b // MathUtils.gcd(a, b)  # 使用公式:a*b/gcd(a,b)@staticmethoddef factorial(n):"""阶乘函数:计算n的阶乘"""if n < 0:  # 验证输入raise ValueError("阶乘不能用于负数")result = 1for i in range(2, n + 1):  # 遍历计算result *= ireturn result@staticmethoddef fibonacci(n):"""斐波那契数列:生成第n个斐波那契数"""if n <= 0:  # 边界条件处理return 0if n == 1:return 1a, b = 0, 1  # 初始化前两个数for _ in range(2, n + 1):  # 迭代计算a, b = b, a + b  # 更新值return b  # 返回结果
4. 与系统或框架交互的辅助函数
class FileSystem:@staticmethoddef ensure_directory_exists(directory_path):"""确保目录存在:如不存在则创建目录"""import osif not os.path.exists(directory_path):  # 检查目录是否存在os.makedirs(directory_path)  # 创建目录及其父目录return True  # 表示创建了新目录return False  # 表示目录已存在@staticmethoddef is_file_empty(file_path):"""检查文件是否为空:通过文件大小判断"""import osreturn os.path.getsize(file_path) == 0  # 文件大小为0则为空@staticmethoddef get_file_extension(file_path):"""获取文件扩展名:提取文件后缀"""import osreturn os.path.splitext(file_path)[1]  # 分割文件名和扩展名@staticmethoddef get_files_by_extension(directory, extension):"""获取特定扩展名的文件:列出目录中指定类型的文件"""import osfiles = []for file in os.listdir(directory):  # 遍历目录if file.endswith(extension):  # 检查扩展名files.append(os.path.join(directory, file))  # 添加完整路径return files@staticmethoddef get_file_creation_time(file_path):"""获取文件创建时间:返回文件的创建时间戳转换后的日期"""import osimport datetimecreation_time = os.path.getctime(file_path)  # 获取创建时间戳return datetime.datetime.fromtimestamp(creation_time)  # 转换为可读格式

六、方法类型选择决策流程

以下是一个简单的决策流程,帮助你选择合适的方法类型:

  1. 问自己:这个方法需要访问或修改特定实例的状态吗?

    • 如果:使用实例方法
    • 如果:继续下一个问题
  2. 问自己:这个方法需要访问或修改类级别的状态吗?

    • 如果:使用类方法
    • 如果:继续下一个问题
  3. 问自己:这个方法在逻辑上属于这个类吗?

    • 如果:使用静态方法
    • 如果:考虑将其放到类外部作为常规函数,或放到更相关的类中

七、混合使用的实际案例

在实际项目中,通常会混合使用这三种方法类型:

class PaymentProcessor:# 类变量supported_providers = ["paypal", "stripe", "alipay"]transaction_count = 0def __init__(self, provider, api_key):if not PaymentProcessor.is_supported_provider(provider):raise ValueError(f"不支持的支付提供商: {provider}")self.provider = providerself.api_key = api_keyself.transactions = []# 实例方法:操作特定处理器的状态def process_payment(self, amount, currency, description):"""处理支付"""if not self.is_valid_amount(amount):raise ValueError("无效的支付金额")# 生成交易IDtransaction_id = PaymentProcessor.generate_transaction_id()# 处理支付逻辑(简化示例)transaction = {"id": transaction_id,"amount": amount,"currency": currency,"description": description,"provider": self.provider,"status": "completed","timestamp": PaymentProcessor.get_current_timestamp()}self.transactions.append(transaction)PaymentProcessor.transaction_count += 1return transaction_iddef get_transaction_history(self):"""获取处理器的交易历史"""return self.transactions# 类方法:操作类状态或创建实例@classmethoddef add_provider(cls, provider):"""添加新的支付提供商"""if provider not in cls.supported_providers:cls.supported_providers.append(provider)return Truereturn False@classmethoddef get_transaction_count(cls):"""获取总交易数"""return cls.transaction_count@classmethoddef create_paypal_processor(cls, api_key):"""创建PayPal处理器的便捷方法"""return cls("paypal", api_key)@classmethoddef create_stripe_processor(cls, api_key):"""创建Stripe处理器的便捷方法"""return cls("stripe", api_key)# 静态方法:辅助功能@staticmethoddef is_supported_provider(provider):"""检查提供商是否受支持"""return provider in PaymentProcessor.supported_providers@staticmethoddef is_valid_amount(amount):"""验证金额是否有效"""return isinstance(amount, (int, float)) and amount > 0@staticmethoddef generate_transaction_id():"""生成唯一交易ID"""import uuidreturn str(uuid.uuid4())@staticmethoddef get_current_timestamp():"""获取当前时间戳"""import timereturn int(time.time())@staticmethoddef format_currency(amount, currency):"""格式化货币显示"""currency_symbols = {"USD": "$", "EUR": "€", "GBP": "£", "JPY": "¥", "CNY": "¥", "RUB": "₽"}symbol = currency_symbols.get(currency, currency)return f"{symbol}{amount:.2f}"

八、总结

使用实例方法的情况:

  • 需要访问或修改实例的属性
  • 方法表示对象的行为或状态变化
  • 方法需要操作特定实例的数据
  • 方法在不同实例间表现出不同行为

使用类方法的情况:

  • 需要访问或修改类变量
  • 实现替代构造函数(工厂方法)
  • 方法涉及到所有类实例的共同逻辑
  • 在继承体系中需要感知调用方法的具体类

使用静态方法的情况:

  • 方法不需要访问实例或类的状态
  • 提供与类主题相关的辅助功能
  • 实现工具函数,但在逻辑上属于这个类
  • 方法是纯函数,输入相同则输出相同

选择恰当的方法类型不仅能使代码更加清晰,还能更准确地表达方法的意图和功能范围,从而提高代码的可读性和可维护性。理解这三种方法类型的区别和适用场景,是掌握Python面向对象编程的重要一步。

相关文章:

Python OOP核心技巧:如何正确选择实例方法、类方法和静态方法

Python方法类型全解析&#xff1a;实例方法、类方法与静态方法的使用场景 一、三种方法的基本区别二、访问能力对比表三、何时使用实例方法使用实例方法的核心场景&#xff1a;具体应用场景&#xff1a;1. 操作实例属性2. 对象间交互3. 实现特定实例的行为 四、何时使用类方法使…...

RK3588 ADB使用

安卓adb操作介绍 adb&#xff08;Android Debug Bridge&#xff09;是一个用于与安卓设备进行通信和控制的工具。adb可以通过USB或无线网络连接安卓设备&#xff0c;执行各种命令&#xff0c;如安装和卸载应用&#xff0c;传输文件&#xff0c;查看日志&#xff0c;运行shell命…...

ubuntu环境下 基于Python 打包的 批量命令行可视化操作工具 GUI

文章目录 一.需求&#xff1a;二.原理支撑&#xff1a;三.简单Demo四.封装成GUI1.依赖库2.代码 五.打包成可执行文件六.命令行的配置七.运行效果 一.需求&#xff1a; 作为测试工程师&#xff0c;为了到现场高效的调试&#xff0c;部署工作&#xff0c;需要一个可视化的工具&a…...

大语言模型 10 - 从0开始训练GPT 0.25B参数量 补充知识之模型架构 MoE、ReLU、FFN、MixFFN

写在前面 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是目前最广泛应用的大语言模型架构之一&#xff0c;其强大的自然语言理解与生成能力背后&#xff0c;是一个庞大而精细的训练流程。本文将从宏观到微观&#xff0c;系统讲解GPT的训练过程&#xff0c;…...

SkyWalking的工作原理和搭建过程

SkyWalking 是一个开源的 应用性能监控系统&#xff08;APM&#xff09;&#xff0c;专为云原生、微服务架构设计。其核心原理基于 分布式追踪&#xff08;Distributed Tracing&#xff09;、指标收集&#xff08;Metrics Collection&#xff09; 和 日志关联&#xff08;Log C…...

CMS(plone / joomla 搭建测试)

开源选择 wordpress 用得最多 也是最容易有漏洞被攻击 被挂木马的 joomla &#xff08;JMS多站点&#xff1a;商业扩展&#xff09; — 多站点需付费 Drupal ProcessWire Plone因其内置的强大安全特性和较少的用户基础&#xff08;相比 WordPress 和 Joomla&#xff09;&#…...

基于 Flink 的实时推荐系统:从协同过滤到多模态语义理解

基于 Flink 的实时推荐系统&#xff1a;从协同过滤到多模态语义理解 嘿&#xff0c;各位技术小伙伴们&#xff01;在这个信息爆炸的时代&#xff0c;你是不是常常惊叹于各大平台仿佛能 “读懂你的心”&#xff0c;精准推送你感兴趣的内容呢&#xff1f;今天&#xff0c;小编就…...

Flink SQL、Hudi 、Doris在数据上的组合应用

Flink SQL、Hudi 和 Doris 是大数据领域中不同定位的技术组件&#xff0c;各自解决不同的问题&#xff0c;以下从核心定位、关键特性和典型场景三个维度展开说明&#xff1a; 1. Flink SQL&#xff1a;流批统一的实时计算引擎 核心定位&#xff1a;Flink 是 Apache 顶级的流批…...

Flink运维要点

一、Flink 运维核心策略 1. 集群部署与监控 资源规划 按业务优先级分配资源&#xff1a;核心作业优先保障内存和 CPU&#xff0c;避免资源竞争。示例&#xff1a;为实时风控作业分配专用 TaskManager&#xff0c;配置 taskmanager.memory.process.size8g。 监控体系 集成 Prom…...

VSCode + Cline AI辅助编程完全指南

VSCode Cline AI辅助编程完全指南 在当今AI快速发展的时代&#xff0c;程序员可以通过AI工具极大地提高工作效率。本教程将详细介绍如何使用VSCode结合Cline&#xff08;Claude AI助手&#xff09;进行AI辅助编程&#xff0c;帮助你提高开发效率&#xff0c;解决复杂问题。 …...

【源码级开发】Qwen3接入MCP,企业级智能体开发实战!

Qwen3接入MCP智能体开发实战&#xff08;上&#xff09; 一、MCP技术与Qwen3原生MCP能力介绍 1.智能体开发核心技术—MCP 1.1 Function calling技术回顾 如何快速开发一款智能体应用&#xff0c;最关键的技术难点就在于如何让大模型高效稳定的接入一些外部工具。而在MCP技术…...

回调函数应用示例

回调函数是一种通过函数指针&#xff08;或引用&#xff09;调用的函数&#xff0c;它在特定事件或条件发生时被另一个函数调用。回调函数的核心思想是将函数作为参数传递&#xff0c;以便在适当的时候执行自定义逻辑&#xff0c;常用于异步编程、事件驱动架构等场景。 业务场景…...

R语言如何解决导出pdf中文不显示的问题

前言 以前绘图都默认英文&#xff0c;突然要求都改成中文&#xff0c;呆住。。。。。。。。。 标题代码实现 ### 导入工具包 ### library(readr) library(dplyr) library(corrplot)df <- read_csv("./clinical.csv") df <- df %>% select(-id, -label)##…...

国产linux系统(银河麒麟,统信uos)使用 PageOffice自定义Word模版中的数据区域

​ PageOffice 国产版 &#xff1a;支持信创系统&#xff0c;支持银河麒麟V10和统信UOS&#xff0c;支持X86&#xff08;intel、兆芯、海光等&#xff09;、ARM&#xff08;飞腾、鲲鹏、麒麟等&#xff09;、龙芯&#xff08;Mips、LoogArch&#xff09;芯片架构。 在实际的Wor…...

llamafactory SFT 从断点恢复训练

背景 我使用llamafactory sft 微调模型的时候。gpu停止运行了。日志文件没有任何的报错信息。 显存还是占用状态。 查看llamafactory的进程是下述信息&#xff1a; 151312 151306 91 17:42 ? 03:58:10 [llamafactory-cl] 既然如此&#xff0c;那就只能从断点恢复训练了。 …...

C#里使用Prism.Core的例子

由于使用WPF来开发应用程序, 那么就会使用一些框架程序来加速开发,一般会使用Prism.Core来加速。 这个应用最后运行的显示如下: 第一步需要安装下面的包: <?xml version="1.0" encoding="utf-8"?> <packages><package id="Mi…...

【MySQL】数据库三大范式

目录 一. 什么是范式 二. 第一范式 三. 第二范式 不满足第二范式时可能出现的问题 四. 第三范式 一. 什么是范式 在数据库中范式其实就是一组规则&#xff0c;在我们设计数据库的时候&#xff0c;需要遵守不同的规则要求&#xff0c;设计出合理的关系型数据库&#xff0c;…...

window 显示驱动开发-分页视频内存资源

与 Microsoft Windows 2000 显示驱动程序模型不同&#xff0c;Windows Vista 显示驱动程序模型允许创建比可用物理视频内存总量更多的视频内存资源&#xff0c;然后根据需要分页进出视频内存。 换句话说&#xff0c;并非所有视频内存资源都同时位于视频内存中。 GPU 的管道中可…...

炼丹学习笔记3---ubuntu2004部署运行openpcdet记录

前言 环境 cuda 11.3 python 3.8 ubuntu2004 一、cuda环境检测 ylhy:~/code_ws/OpenPCDet/tools$ nvcc -V nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2021 NVIDIA Corporation Built on Sun_Mar_21_19:15:46_PDT_2021 Cuda compilation tools, release 11.3…...

美创科技针对《银行保险机构数据安全管理办法》解读

在数字化浪潮席卷下&#xff0c;银行保险业的运营模式发生了翻天覆地的变化&#xff0c;数据已然成为行业发展的核心驱动力。从客户基本信息、交易记录&#xff0c;到业务运营的关键数据、市场分析报告&#xff0c;海量数据背后潜藏巨大价值。然而&#xff0c;数据安全风险也随…...

activeMq 限制用户接收topic范围

1、在conf配置文件中找到jetty-realm.properties文件&#xff0c;添加用户信息 2、在broker标签中加入topic限制权限信息 <plugins><simpleAuthenticationPlugin><users><authenticationUser username"admin" password"admin" group…...

LIIGO ❤️ RUST 12 YEARS

LIIGO &#x1f496; RUST 12 YEARS 今天是RUST语言1.0发布十周年纪念日。十年前的今天&#xff0c;2015年的今天&#xff0c;Rust 1.0 正式发行。这是值得全球Rust支持者隆重纪念的日子。我借此机会衷心感谢Rust语言创始人Graydon Hoare&#xff0c;Mozilla公司&#xff0c;以…...

增量学习:机器学习领域中的资源高效利用秘籍

前言 在机器学习的广袤天地中&#xff0c;增量学习宛如一颗冉冉升起的新星&#xff0c;正逐渐展现出其独特的魅力和巨大的潜力。 它是一种能让 AI 模型像人类一样&#xff0c;逐步学习并不断强化自身知识&#xff0c;同时不会遗忘过往所学信息的学习方法。随着时代的飞速发展&a…...

OpenCV 背景建模详解:从原理到实战

在计算机视觉领域&#xff0c;背景建模是一项基础且重要的技术&#xff0c;它能够从视频流中分离出前景目标&#xff0c;广泛应用于运动目标检测、视频监控、人机交互等场景。OpenCV 作为计算机视觉领域最受欢迎的开源库之一&#xff0c;提供了多种高效的背景建模算法。本文将深…...

makefile细节说明

在 Makefile中&#xff0c;依赖关系的左右两部分有特定的名称&#xff1a; ​​左边部分&#xff08;冒号左侧&#xff09;​​ 称为 ​​目标&#xff08;Target&#xff09;​​ ​​右边部分&#xff08;冒号右侧&#xff09;​​ 称为 ​​依赖项&#xff08;Prerequisite…...

计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 10.增强表面细节(二)法线贴图

1. 法线贴图&#xff08;Normal Mapping&#xff09; 法线贴图是一种在3D图形渲染中广泛使用的表面细节增强技术。它通过存储每个像素的法线信息来模拟表面的细微凹凸细节&#xff0c;而无需增加实际的几何复杂度。 1.1. 工作原理 纹理存储 使用RGB通道存储法线向量的XYZ分量…...

使用 OpenCV 将图像中标记特定颜色区域

在计算机视觉任务中&#xff0c;颜色替换是一种常见的图像处理操作&#xff0c;广泛用于视觉增强、目标高亮、伪彩色渲染等场景。本文介绍一种简单而高效的方式&#xff0c;基于 OpenCV 检测图像中接近某种颜色的区域&#xff0c;并将其替换为反色&#xff08;对比色&#xff0…...

Service Mesh

目录 一、Service Mesh 的核心特点 二、Service Mesh 的典型架构 1. Sidecar 模式 2. 控制平面与数据平面分离 三、Service Mesh 解决的核心问题 四、典型应用场景 五、主流 Service Mesh 框架对比 六、挑战与局限性 七、未来趋势 总结 Istio 一、Istio 核心组件与…...

反射机制详细说明

反射机制详细说明 1. 反射的基本概念 反射(Reflection)是Java提供的一种在运行时(Runtime)动态获取类信息并操作类属性、方法和构造器的机制。通过反射,程序可以在运行时检查类、接口、字段和方法,并且可以实例化对象、调用方法、访问或修改字段值,甚至操作私有成员,…...

基于Mongodb的分布式文件存储实现

分布式文件存储的方案有很多&#xff0c;今天分享一个基于mongodb数据库来实现文件的存储&#xff0c;mongodb支持分布式部署&#xff0c;以此来实现文件的分布式存储。 基于 MongoDB GridFS 的分布式文件存储实现&#xff1a;从原理到实战 一、引言 当系统存在大量的图片、…...

相机Camera日志分析之九:高通相机Camx 基于预览1帧的ConfigureStreams二级日志分析详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:高通相机Camx 日志分析之三:camx hal预览1帧logcat日志opencamera详解 相机Camera日志分析之三:不想输出每秒30帧巨量日志,如何只输出1帧日志作为学习使用? 这一篇我们开始讲: 高通相机Camx 日志…...

neo4j框架:ubuntu系统中neo4j安装与使用教程

在使用图数据库的时候&#xff0c;经常需要用到neo4j这一图数据库处理框架。本文详细介绍了neo4j安装使用过程中的问题与解决方法。 一、安装neo4j 在安装好了ubuntu系统、docker仓库和java的前提下 在ubuntu系统命令行依次输入如下命令&#xff1a; # 安装依赖库 sudo apt-…...

k8s灰度发布

基于 Traefik 的加权灰度发布-腾讯云开发者社区-腾讯云 Traefik | Traefik | v1.7 Releases traefik/traefik GitHub 从上面连接下载后上传到harbor虚拟机 vagrant upload /C/Users/HP280/Downloads/traefik 下载配置文件 wget -c http://raw.githubusercontent.com/conta…...

K8S从Harbor拉取镜像

参考 配置cri-docker使kubernetes1.24以docker作为运行时_启动cirdocker_跳跃音符#3712的博客-CSDN博客 部署Harbor私有容器镜像仓库并配置Kubernetes从Harbor拉取镜像的方法_运维个西瓜的博客-CSDN博客 K8S连接Harbor私有仓库_k8s harbor 登录-CSDN博客 K8S集群配置使用私…...

【Spring Boot后端组件】mybatis-plus使用

文章目录 mybatis-plus使用一、依赖引入二、添加相关配置项三、功能详解1.自增主键2.逻辑删除3.操作时间自动填充4.其他字段自动填充5.分页查询6.自定义动态查询7.代码生成器8.代码生成器(自定义模板) mybatis-plus使用 一、依赖引入 pom.xml文件 <?xml version"1.…...

Oc语言学习 —— 重点内容总结与拓展(下)

类别&#xff08;分类&#xff09;和拓展 分类&#xff1a; 专门用来给类添加新方法 不能给类添加成员属性&#xff0c;添加成员属性也无法取到 注意&#xff1a;其实可与通过runtime 给分类添加属性&#xff0c;即属性关联&#xff0c;重写setter&#xff0c;getter方法 分类…...

智脑进化:神经网络如何从单层感知机迈向深度学习新纪元

第一章&#xff1a;神经元的启示——从生物大脑到人工神经元 1.1 生物神经元的智慧&#xff1a;860亿神经元的协同网络 人类大脑的860亿神经元通过突触形成动态网络&#xff0c;每个神经元通过树突接收信号&#xff0c;在胞体整合后经轴突传递输出。这种“接收-处理-输出”的…...

雷云4 鼠标滚轮单击失灵解决办法

问题现象&#xff1a;打开雷云4 &#xff0c;滚轮单击才有反应&#xff0c;退出雷云4&#xff0c;滚轮单击没反应。 解决方案&#xff1a; 打开雷云4&#xff0c; 选中鼠标中键&#xff0c;选择鼠标功能&#xff0c;选择滚轮单击&#xff0c;保存 然后退出后&#xff0c; …...

Spring Cloud动态配置刷新:@RefreshScope与@Component的协同机制解析

在微服务架构中&#xff0c;动态配置管理是实现服务灵活部署、快速响应业务变化的关键能力之一。Spring Cloud 提供了基于 RefreshScope 和 Component 的动态配置刷新机制&#xff0c;使得开发者可以在不重启服务的情况下更新配置。 本文将深入解析 RefreshScope 与 Component…...

vue2集成可在线编辑的思维导图(simple-mind-map)

最近要求做一个可在线编辑的思维导图&#xff0c;经过层层调研和实测&#xff0c;最简单的思维导图导图实现还得是simple-mind-map组件 simple-mind-map中文文档 当前我使用的是vue2项目&#xff0c;目前没试过是否支持vue3&#xff0c;但是看官网描述他们也给了有vue3的demo项…...

【开源Agent框架】CAMEL:角色扮演+任务分解

一、项目概览:重新定义智能体协作范式 CAMEL(Communicative Agents for “Mind” Exploration of Large Language Model Society)是由camel-ai社区开发的开源多智能体框架,致力于探索智能体的规模法则(Scaling Laws)。该项目通过构建包含百万级智能体的复杂社会系统,研…...

Elasticsearch-kibana索引操作

1索引模版 添加索引 PUT /_index_template/account_transaction {"priority": 0,"index_patterns": ["account_transaction*"],"template": {"settings": {"index": {"number_of_shards": "50&q…...

【python编程从入门到到实践】第十章 文件和异常

一、读取文件 pi_digits.txt3.1415926535897932384626433832791.读取文件的全部内容 # file_reader.pyfrom pathlib import Pathpath Path("pi_digits.txt") contents path.read_text() print(contents)2.相对文件路径和绝对文件路径 当相对路径行不通时&#x…...

Reactive与Ref的故事

Vue 3的两位"响应式英雄":Reactive与Ref的故事 基本介绍:响应式的两种武器 Vue 3提供了两种创建响应式数据的主要API:reactive()和ref()。它们像两种不同的魔法工具,各有所长,共同构建Vue的响应式王国。 ┌────────────────────────…...

基于Scrapy-Redis的分布式景点数据爬取与热力图生成

1. 引言 在旅游行业和城市规划中&#xff0c;热门景点的数据分析具有重要意义。通过爬取景点数据并生成热力图&#xff0c;可以直观展示游客分布、热门区域及人流趋势&#xff0c;为商业决策、景区管理及智慧城市建设提供数据支持。 然而&#xff0c;单机爬虫在面对大规模数据…...

MySQL数据库——支持远程IP访问的设置方法总结

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实…...

现在环保方面有什么新的技术动态

环保领域的技术发展迅速&#xff0c;尤其在“双碳”目标、数字化转型和可持续发展背景下&#xff0c;涌现出许多创新技术和应用。以下是当前环保领域的新技术动态&#xff08;截至2024年&#xff09;&#xff1a; 一、碳中和与碳减排技术 CCUS&#xff08;碳捕集、利用与封存&a…...

[模型部署] 1. 模型导出

&#x1f44b; 你好&#xff01;这里有实用干货与深度分享✨✨ 若有帮助&#xff0c;欢迎&#xff1a;​ &#x1f44d; 点赞 | ⭐ 收藏 | &#x1f4ac; 评论 | ➕ 关注 &#xff0c;解锁更多精彩&#xff01;​ &#x1f4c1; 收藏专栏即可第一时间获取最新推送&#x1f514;…...

Neo4j 图书馆借阅系统知识图谱设计

一、数据模型设计 节点类型 读者(Reader) 属性: reader_id, name, age, gender, phone, email, register_date 图书(Book) 属性: book_id, title, author, publisher, publish_date, isbn, price, category 图书副本(BookCopy) 属性: copy_id, status (在馆/借出/维修), loca…...

android 安装openwrt 安正步骤

安装 QEMU 模拟器 bash 复制 编辑 pkg install wget pkg install qemu-utils pkg install qemu-system-aarch64-headless 可选 x86 模拟支持: bash 复制 编辑 pkg install qemu-system-x86-64-headless ✅ 下载 OpenWRT 镜像(armvirt 64) bash 复制 编辑 mkdir -p ~/openwr…...