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

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. 实现特定实例的行为 四、何时使用类方法使…...

【Linux笔记】nfs网络文件系统与autofs(nfsdata、autofs、autofs.conf、auto.master)

一、nfs概念 NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09; 是一种由 Sun Microsystems 于1984年开发的分布式文件系统协议&#xff0c;允许用户通过网络访问远程计算机上的文件&#xff0c;就像访问本地文件一样。它广泛应用于 Unix/Linux 系统&a…...

博客打卡-求解流水线调度

题目如下&#xff1a; 有n个作业&#xff08;编号为1&#xff5e;n&#xff09;要在由两台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工&#xff0c;然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi&#xff08;1≤i≤n&#xff09;。 流水…...

基于React的高德地图api教程006:两点之间距离测量

文章目录 6、距离测量6.1 两点之间距离测量6.1.1 两点距离测量按钮6.1.2 点击地图添加点6.1.3 测量两点之间距离并画线6.2 测量过程显示两点之间预览线6.3 绘制完毕6.4 显示清除按钮6.5 代码下载6.06、距离测量 6.1 两点之间距离测量 6.1.1 两点距离测量按钮 实现代码: re…...

数据库blog1_信息(数据)的处理与效率提升

&#x1f33f;信息的处理 &#x1f342;实际中离不开信息处理 ● 解决问题的建模 任何对问题的处理都可以看作数据的输入、处理、输出。 eg.一个项目中&#xff0c;用户点击信息由前端接收传递到后端处理后返回结果eg.面对一个问题&#xff0c;我们在搜集信息后做出处理与分析…...

布隆过滤器介绍及其在大数据场景的应用

目录 布隆过滤器&#xff08;Bloom Filter&#xff09;介绍一、布隆过滤器的基本原理插入元素过程&#xff1a;查询元素过程&#xff1a; 二、布隆过滤器的特点三、误判率计算四、举例说明五、总结 Python版的简单布隆过滤器实现示例一、简单布隆过滤器Python示例二、布隆过滤器…...

Ansys 计算刚柔耦合矩阵系数

Ansys 计算刚柔耦合系数矩阵 文章目录 Ansys 计算刚柔耦合系数矩阵卫星的刚柔耦合动力学模型采用 ANSYS 的 APDL 语言的计算方法系统转动惯量的求解方法参考文献 卫星的刚柔耦合动力学模型 柔性航天器的刚柔耦合动力学模型可以表示为 m v ˙ B t r a n η F J ω ˙ ω J…...

微服务八股(自用)

微服务 SpringCloud 注册中心&#xff1a;Eureka 负载均衡&#xff1a;Ribbon 远程调用&#xff1a;Feign 服务熔断&#xff1a;Hystrix 网关&#xff1a;Gateway/Zuul Alibaba 配置中心&#xff1a;Nacos 负载均衡&#xff1a;Ribbon 服务调用&#xff1a;Feign 服务…...

指定elf文件dwarf 版本以及查看dwarf版本号

背景&#xff1a; 在实际项目开发过程中&#xff0c;为了让低版本的CANape 工具识别elf 文件&#xff0c;需要在编译elf文件时&#xff0c;指定dwarf的版本。 使用方法&#xff1a; 需要再CMakeLists.txt中指定dwarf 版本 add_compile_options(-g -gdwarf-2) #-gdwarf-4 验…...

Fidder基本操作

1.抓取https请求 Fidder默认不能抓取https请求&#xff0c;我们必须通过相应的设置才能抓取https请求 1.选择tools下的option 2.选择https选项&#xff0c;并且勾选下面的选项 3.点击Actions导出信任证书到桌面(expert root certificate to desktop) 4.在浏览器中添加对应的证…...

项目管理进阶:精读 78页华为项目管理高级培训教材【附全文阅读】

本文概述了华为项目管理&#xff08;高级&#xff09;课程的学习目标及学习方法。学习该课程后&#xff0c;学员应能&#xff1a; 1. **深刻理解项目管理**&#xff1a;掌握项目管理的基本概念与方法&#xff0c;构建项目管理思维框架。 2. **应用IBEST理念**&#xff1a;结合I…...

[Java] 方法和数组

目录 1. 方法 1.2 什么是方法 1.2 方法的定义 1.3 方法的调用 1.4 方法的重载 1.5 递归 2. 一维数组 2.1 什么是数组 2.2 数组的创建 2.3 数组的初始化 2.4 遍历数组 2.5 引用数据类型 2.6 关于null 2.7 数组转字符串 2.8 数组元素的查找 2.9 数组的排序 2.10…...

微软家各种copilot的AI产品:Github copilot、Microsoft copilot

背景 大家可能听到很多copilot&#xff0c;比如 Github Copilot&#xff0c;Microsoft Copilot、Microsoft 365 Copilot&#xff0c;有什么区别 Github Copilot&#xff1a;有网页版、有插件&#xff08;idea、vscode等的插件&#xff09;&#xff0c;都是面向于程序员的。Mi…...

KL散度 (Kullback-Leibler Divergence)

KL散度&#xff0c;也称为相对熵 (Relative Entropy)&#xff0c;是信息论中一个核心概念&#xff0c;用于衡量两个概率分布之间的差异。给定两个概率分布 P ( x ) P(x) P(x) 和 Q ( x ) Q(x) Q(x)&#xff08;对于离散随机变量&#xff09;或 p ( x ) p(x) p(x) 和 q ( x …...

深入解析:java.sql.SQLException: No operations allowed after statement closed 报错

在 Java 应用程序开发过程中&#xff0c;尤其是涉及数据库交互时&#xff0c;开发者常常会遇到各种各样的异常。其中&#xff0c;java.sql.SQLException: No operations allowed after statement closed是一个较为常见且容易令人困惑的错误。本文将深入剖析这一报错&#xff0c…...

DAY 23 训练

DAY 23 训练 DAY23 机器学习管道 pipeline基础概念转换器&#xff08;Transformer&#xff09;估计器&#xff08;Estimator&#xff09; 管道&#xff08;Pipeline&#xff09;代码演示没有 pipeline 的代码pipeline 的代码教学导入库和数据加载分离特征和标签&#xff0c;划分…...

wordcount程序

### 在 IntelliJ IDEA 中编写和运行 Spark WordCount 程序 要使用 IntelliJ IDEA 编写并运行 Spark 的 WordCount 程序&#xff0c;需按照以下流程逐步完成环境配置、代码编写以及任务提交。 --- #### 1. **安装与配置 IntelliJ IDEA** 确保已正确安装 IntelliJ IDEA&#x…...

回溯法理论基础 LeetCode 77. 组合 LeetCode 216.组合总和III LeetCode 17.电话号码的字母组合

目录 回溯法理论基础 回溯法 回溯法的效率 用回溯法解决的问题 如何理解回溯法 回溯法模板 LeetCode 77. 组合 回溯算法的剪枝操作 LeetCode 216.组合总和III LeetCode 17.电话号码的字母组合 回溯法理论基础 回溯法 回溯法也可以叫做回溯搜索法&#xff0c;它是一…...

【进程控制二】进程替换和bash解释器

【进程控制二】进程替换 1.exec系列接口2.execl系列2.1execl接口2.2execlp接口2.3execle 3.execv系列3.1execv3.2总结 4.实现一个bash解释器4.1内建命令 通过fork创建的子进程&#xff0c;会继承父进程的代码和数据&#xff0c;因此本质上还是在执行父进程的代码 进程替换可以将…...

线性回归策略

一种基于ATR(平均真实范围)、线性回归和布林带的交易策略。以下是对该策略的全面总结和分析: 交易逻辑思路 1. 过滤条件: - 集合竞价过滤:在每个交易日的开盘阶段,过滤掉集合竞价产生的异常数据。 - 价格异常过滤:排除当天开盘价与最高价或最低价相同的情况,这…...

Linux下的c/c++开发之操作Redis数据库

C/C 操作 Redis 的常用库 在 C/C 开发中操作 Redis 有多种方式&#xff0c;最主流的选择是使用第三方客户端库。由于 Redis 官方本身是使用 C 编写的&#xff0c;提供的 API 非常适合 C/C 调用。常见的 Redis C/C 客户端库包括&#xff1a; hiredis&#xff1a;官方推荐的轻量…...

Bitmap、Roaring Bitmap、HyperLogLog对比介绍

一、Bitmap(位图)概述 Bitmap 是一种用位(bit)来表示集合元素是否存在的数据结构。每个位代表一个元素的状态(0或1),非常节省空间且支持快速集合操作。 常见Bitmap类型: 普通Bitmap 最简单的位数组,适合元素范围固定且不稀疏的场景。例如,元素范围是0~1000,用1001…...

JavaScript 的编译与执行原理

文章目录 前言&#x1f9e0; 一、JavaScript 编译与执行过程1. 编译阶段&#xff08;发生在代码执行前&#xff09;✅ 1.1 词法分析&#xff08;Lexical Analysis&#xff09;✅ 1.2 语法分析&#xff08;Parsing&#xff09;✅ 1.3 语义分析与生成执行上下文 &#x1f9f0; 二…...

fastapi项目中数据流转架构设计规范

一、数据库层设计 1.1 ORM模型定义 class SysUser(Base):__table_args__ {"mysql_engine": "InnoDB","comment": "用户表"}id: Mapped[int] mapped_column(Integer, primary_keyTrue, autoincrementTrue, comment"用户ID&quo…...

NHANES指标推荐:FMI

文章题目&#xff1a;Exploring the relationship between fat mass index and metabolic syndrome among cancer patients in the U.S: An NHANES analysis DOI&#xff1a;10.1038/s41598-025-90792-9 中文标题&#xff1a;探索美国癌症患者脂肪量指数与代谢综合征之间的关系…...

【JDBC】JDBC常见错误处理方法及驱动的加载

MySQL8中数据库连接的四个参数有两个发生了变化 String driver "com.mysql.cj.jdbc.Driver"; String url "jdbc:mysql://127.0.0.1:3306/mydb?useSSLfalse&useUnicodetrue&characterEncodingutf8&serverTimezoneAsia/Shanghai"; 或者Strin…...

React中useState中更新是同步的还是异步的?

文章目录 前言一、useState 的基本用法二、useState 的更新机制1. 内部状态管理2. 状态初始化3. 状态更新 三、useState 的更新频率与异步行为1. 异步更新与批量更新2. 为什么需要异步更新&#xff1f; 四、如何正确处理 useState 的更新1. 使用回调函数形式的更新2. 理解异步更…...

Vim编辑器命令模式操作指南

Vim 的命令模式&#xff08;即 Normal 模式&#xff09;是 Vim 的核心操作模式&#xff0c;用于执行文本编辑、导航、搜索、保存等操作。以下是命令模式下的常用操作总结&#xff1a; 1. 模式切换 进入命令模式&#xff1a;在任何模式下按 Esc 键&#xff08;可能需要多次按&a…...

车载以太网驱动智能化:域控架构设计与开发实践

title: 车载以太网驱动专用车智能化&#xff1a;域控架构设计与开发实践 date: 2023-12-01 categories: 新能源汽车 tags: [车载以太网, 电子电气架构, 域控架构, 专用车智能化, SOME/IP, AUTOSAR] 引言&#xff1a;专用车智能化转型的挑战与机遇 专用车作为城市建设与工业运输…...

如何利用技术手段提升小学数学练习效率

在日常辅导孩子数学作业的过程中&#xff0c;我发现了一款比较实用的练习题生成工具。这个工具的安装包仅1.8MB大小&#xff0c;但基本能满足小学阶段的数学练习需求。 主要功能特点&#xff1a; 参数化出题 可自由设置数字范围&#xff08;如10以内、100以内&#xff09; 支…...