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

31天Python入门——第20天:魔法方法详解

在这里插入图片描述

你好,我是安然无虞。

文章目录

    • 魔法方法
      • 1. `__new__和__del__`
      • 2. `__repr__和__len__`
      • 3. `__enter__和__exit__`
      • 4. 可迭代对象和迭代器
      • 5. 中括号`[]`数据操作
      • 6. `__getattr__`、`__setattr__` 和 `__delattr__`
      • 7. 可调用的
      • 8. 运算符

在这里插入图片描述

魔法方法

魔法方法: Python中的魔法方法是一类特殊的方法, 它们以双下划线 __ 开头和结尾, 用于实现类的特殊行为.这些魔法方法在Python中具有特殊的含义, 可以让你自定义类的行为, 使其更符合你的需求, 它们一般是自动调用, 也可以通过内置函数来显式调用.

1. __new__和__del__

__new__ 是 Python 中的一个特殊魔法方法, 用于创建对象实例.它在对象实例被创建之前被调用, 通常用于控制对象的创建过程和自定义对象的创建方式.与之相对的是 __init__ 方法, 它在对象实例创建后进行初始化操作.

__new__的注意点:

  1. 返回实例对象: __new__ 方法必须返回一个类的实例对象.通常情况下, 它会调用父类的 __new__ 方法来创建实例, 并返回实例对象.
  2. 第一个参数是类: __new__ 方法的第一个参数是类本身, 通常命名为 cls.在调用时, Python 会自动传递类作为第一个参数.
  3. 控制实例创建过程: __new__ 方法允许你控制实例的创建过程.你可以在这个方法中实现自定义的逻辑.
class MyClass:# 在__init__之前被调用def __new__(cls, name):print("__new__")obj = super().__new__(cls)return objdef __init__(self, name):print("__init__")self.name = namemy_class = MyClass('张三')
print(my_class.name)# __new__
# __init__
# 张三
# __new__方法可以控制实例创建过程:
# 单例模式 - 无论你实例化多少次, 始终都是同一个对象class Singleton:def __new__(cls, *args, **kwargs):obj = super().__new__(cls)return objdef __init__(self):passsingle1 = Singleton()
print(id(single1))
single2 = Singleton()
print(id(single2))# 140613070163824
# 140613070163392# 很明显上面并没有实现单例模式, 那怎么实现单例模式呢?
class Singleton:__instance = Nonedef __new__(cls, *args, **kwargs):# 假如已经实例化过了, 就直接返回已经存在的对象if not cls.__instance:cls.__instance = super().__new__(cls)return cls.__instancedef __init__(self):passsingle1 = Singleton()
print(id(single1))
single2 = Singleton()
print(id(single2))# 140240883584880
# 140240883584880

__del__当对象被释放的时候, 会执行. 它通常用于执行一些资源释放或清理操作, 如关闭文件、释放网络连接等. 但是, 但并不保证一定会调用, 因为垃圾回收可能由不同的策略来管理. python中对象的释放是一个比较复杂的过程. 一个对象有可能在引用到0的时候被释放, 且这个释放是可能在任意一个地方发生.

注意:

__del__跟python中的关键字del是没有关系的.del并不一定会触发__del__

class TestDel:def __init__(self):print("__init__")def __del__(self):print("__del__")test_del = TestDel()
print()

Python当中的垃圾回收可以查看网上比较优秀的文章.

2. __repr__和__len__

__repr__ 用于定义对象的字符串表示形式.

__str____repr__都返回一个对象的字符串描述, 不过两者的用途不同, str可以理解是给人阅读的, 而repr是给程序使用的.

print(obj)str(obj)方法调用对象的str方法;交互式CLI、repr(obj)、gdb调试时查看对象值返回的是repr, 不过在多情况下程序员把str和repr设置为一样__str__ == __repr__.

如果没有定义 __str__ 方法, 调用 print() 时会默认使用 __repr__ 方法.

__len__: 用于定义对象的长度(大小).当你在一个对象上调用内置的 len() 函数时, Python 会查找该对象是否定义了 __len__ 方法, 如果有则调用该方法并返回长度值.

class MyList:def __init__(self, items):self.items = itemsdef __len__(self):return len(self.items)my_list = MyList('hello python')
print(len(my_list))

3. __enter__和__exit__

上下文协议是一组特殊方法(__enter__和__exit__同时存在), 允许你创建可用于 with 语句的上下文管理器.使用上下文管理器可以在进入和退出代码块时执行特定操作, 如资源的分配和释放.Python 的上下文协议涉及两个主要的特殊方法:__enter____exit__.

    __enter__(self)

__enter__ 方法:

  • 在进入with语句代码块前被调用, 用于执行一些准备操作.
  • 可以返回一个值, 该值将被赋给 as 关键字之后的变量.
    __exit__(self, exc_type, exc_value, exc_traceback)

__exit__ 方法:

  • 在退出with语句代码块时调用, 无论代码块是否发生异常.
  • 可以用于执行一些清理操作, 如资源的释放.
  • 如果代码块内没有异常发生, 参数为 None, None, None.如果有异常, 参数包含异常类型、异常实例和跟踪信息.
  • 如果 __exit__ 方法返回 True, 异常不会向上继续传播.返回 False 则异常会继续向上抛.

上下文协议的使用案例:可以使用 with 语句来管理文件的打开和关闭, 确保文件资源在退出代码块时被正确释放.

class FileHandler:# 一个实现了上下文协议的类def __init__(self):passdef __enter__(self):passdef __exit__(self, exc_type, exc_val, exc_tb):passfile_handler = FileHandler()
with file_handler:print(11111111111)
logger = logging.getLogger(__name__)class FileHandler:# 一个实现了上下文协议的类def __init__(self, file_name, mode, encoding='utf-8'):self.file_name = file_nameself.mode = modeself.encoding = encodingself.file = Nonedef __enter__(self):self.file = open(self.file_name, self.mode, encoding=self.encoding)return self.filedef __exit__(self, exc_type, exc_val, exc_tb):if exc_type:logger.error(f"出错: {exc_val}")if self.file:print("文件正在关闭")self.file.close()return Truefile_handler = FileHandler("test.py", "r")
with file_handler as f:content = f.read()print(content)# 上下文协议的实现简化了异常捕获的代码, 让异常捕获的封装性更好
try:file = open()
except Exception:# 处理这个异常pass
finally:file.close()

4. 可迭代对象和迭代器

可迭代对象和迭代器是 Python 中用于遍历数据集合的概念.它们在很多情况下都用于实现数据的迭代操作, 如循环.

可迭代对象(Iterable)

可迭代对象是一种数据类型, 可以通过迭代获取其中的元素.

在 Python 中, 任何实现了 __iter__() 方法的对象都被视为可迭代对象.常见的可迭代对象包括列表、元组、字典、集合、字符串等.

可迭代对象的特点:

  • 可以使用 for 循环遍历元素.
  • 可以通过 iter() 函数将其转换为迭代器.
class MyNumber:def __init__(self, numbers):self.numbers = numbersdef __iter__(self):# __iter__()必须返回迭代器return iter(self.numbers)a_list = [1,2,3,4,5,6,7]
my_numbers = MyNumber(a_list)print(isinstance(my_numbers, Iterable)) # Truefor num in my_numbers:print(num)# 如果没有实现__iter__()就会报错:
class MyNumber:def __init__(self, numbers):self.numbers = numbersa_list = [1,2,3,4,5,6,7]
my_numbers = MyNumber(a_list)print(isinstance(my_numbers, Iterable)) Falsefor num in my_numbers:print(num)

迭代器Iterator

迭代器是一个实现了 __iter__()__next__() 方法的对象.__iter__() 方法返回迭代器对象自身, 而 __next__() 方法返回迭代器的下一个元素, 如果没有元素了, 抛出 StopIteration 异常.

迭代器的特点:

  • 可以使用 for 循环遍历元素, 也可以使用 next() 函数逐个获取元素.
  • 只能遍历一次, 遍历完成后就不能再次使用.

总结:

  1. 可迭代对象是具有迭代性质的对象, 而迭代器是一个实现了迭代协议的对象.
  2. 可迭代对象可以通过 iter() 函数转换为迭代器.
  3. 迭代器是一种一次性的数据获取方式, 每次调用 next() 都会获取下一个元素.
class MyNumbersIterator:def __init__(self):passdef __iter__(self):passdef __next__(self):passmy_numbers_iterator = MyNumbersIterator()
print(isinstance(my_numbers_iterator, Iterable)) # True
print(isinstance(my_numbers_iterator, Iterator)) # True# ----------------------------------------------------------------class MyNumbersIterator:def __init__(self, numbers):self.numbers = numbersself.index = 0def __iter__(self):# __iter__()必须返回迭代器return selfdef __next__(self):try:num = self.numbers[self.index]self.index += 1except IndexError:raise StopIterationreturn numa_list = [1,2,3,4,5,6,7]
my_numbers_iterator = MyNumbersIterator(a_list)
print(isinstance(my_numbers_iterator, Iterable))
print(isinstance(my_numbers_iterator, Iterator))

5. 中括号[]数据操作

__getitem____setitem____delitem__ 用于自定义对象的索引访问和操作.它们在创建自定义的容器类时非常有用, 允许你实现类似字典或列表的行为.

  1. __getitem__(self, key)

    这个方法定义了使用索引访问对象时的行为.当你像 obj[key] 这样使用索引操作时, Python 会调用对象的 __getitem__ 方法, 并将索引 key 作为参数传递给这个方法.你可以在这个方法中实现对应的行为, 比如从内部数据结构中获取相应的值.

  2. __setitem__(self, key, value)

    这个方法定义了使用索引赋值操作时的行为.当你像 obj[key] = value 这样进行索引赋值操作时, Python 会调用对象的 __setitem__ 方法, 并将索引 key 和值 value 作为参数传递给这个方法.你可以在这个方法中实现对应的赋值行为.

  3. __delitem__(self, key)

    这个方法定义了使用 del obj[key] 进行索引删除操作时的行为.当你使用 del 删除索引时, Python 会调用对象的 __delitem__ 方法, 并将索引 key 作为参数传递给这个方法.你可以在这个方法中实现删除操作的逻辑.

这些方法的使用可以使你的自定义类更具像内置容器类型(如字典和列表)的行为, 从而实现更灵活和符合预期的数据操作.

# 补充知识:
# 列表切片 返回的是  列表.
# 元组切片 返回是是  元组.
# print(my_numbers[1:3]) # 切片my_numbers[1:3]相当于slice(1,3,None)
# s = slice(1, 3, None)from collections.abc import Iterableclass MyNumbers:# 全部都是数字def __init__(self, numbers):self.numbers = numbersdef __getitem__(self, item):if isinstance(item, slice):# 如果进了判断, 就代表是在做切片, 则需要返回与原本数据类型一致的数据类型.temp = self.numbers[item]cls = type(self)obj = cls(temp)return objelse:num = self.numbers[item]return numdef __setitem__(self, key, value):if isinstance(value, (int, float)):self.numbers[key] = valueelse:raise ValueError(f'{value}的值设置必须是数字类型.')def __str__(self):return f"{self.numbers}"def __len__(self):return len(self.numbers)def __contains__(self, item):return item in self.numbersdef __delitem__(self, key):# 不允许为空, 起码要有一个元素.if len(self.numbers) > 1:self.numbers.pop(key)else:raise ValueError('序列起码要有一个元素')a_list = [1, 2, 3, 4, 5, 6]
# a_dict = {'a': 1, 'b': 2, 'c': 3}
my_numbers = MyNumbers(a_list)
# my_numbers[0] = 8
del my_numbers[0]
del my_numbers[1]
del my_numbers[2]
del my_numbers[0]
del my_numbers[0]
del my_numbers[0]
print(my_numbers)
# print(2 in my_numbers)
# print(type(my_numbers))
# s = slice(1, 3, None)
# print(type(a_list[s]))
# 列表切片 返回的是  列表.
# 元组切片 返回是是  元组.
# print(my_numbers[1:3])
# print(isinstance(my_numbers, Iterable))
#
# for num in my_numbers:
#     print(num)

6. __getattr____setattr____delattr__

__getattr____setattr____delattr__ 是 Python 中的魔法方法, 用于自定义对象的属性访问和操作.它们允许你控制属性的获取、设置和删除行为, 从而实现自定义的属性操作逻辑.

  1. __getattr__(self, name)

    当你访问一个不存在的属性时, Python 会调用对象的 __getattr__ 方法, 并将属性名 name 作为参数传递给这个方法.你可以在这个方法中实现对应的行为, 比如返回一个默认值或者抛出异常.

  2. __setattr__(self, name, value)

    当你设置属性的值时, Python 会调用对象的 __setattr__ 方法, 并将属性名 name 和值 value 作为参数传递给这个方法.你可以在这个方法中实现对应的赋值行为, 比如进行值的验证或修改.

  3. __delattr__(self, name)

    当你删除属性时, Python 会调用对象的 __delattr__ 方法, 并将属性名 name 作为参数传递给这个方法.你可以在这个方法中实现删除属性的逻辑.

这些方法的使用可以使你的自定义类的属性操作更具控制性和灵活性.

class Person:def __init__(self, name, age, info):self.name = nameself.age = ageself.info = infodef __getattr__(self, item):if item in self.info:return self.info[item]else:raise AttributeError(f'{self.__class__}没有{item}属性')def __setattr__(self, key, value):# print(f'__setattr__接收到的参数key的值是{key}, value的值是{value}')if key == 'age':if 0 < value < 150:super().__setattr__(key, value)else:raise AttributeError(f"{key}的值{value}设置不合法")super().__setattr__(key, value)def __delattr__(self, item):if item in ['name', 'age']:raise AttributeError(f"{item!r}是基础属性, 不允许删除")super(Person, self).__delattr__(item)information = {'gender': "男",'height': 180,'hobby': "打篮球",
}
person = Person('张三', 20, information)
person.age = 25
del person.age
print(person.name)
print(person.age)
print(person.gender)
# print(person.height)
# print(person.hobby)
# print(person.aaa)

7. 可调用的

不仅 Python 函数是真正的可调用的, 任何 Python 对象都可以表现得像函数.为此, 只需实现魔法方法 __call__.

__call__ 是 Python 中的一个特殊魔法方法, 用于使对象可以像函数一样被调用.当一个对象被调用时, Python 会检查对象是否定义了 __call__ 方法, 如果定义了, 就会调用该方法, 从而实现对象的可调用行为.

这使得你可以将一个类的实例像函数一样使用, 提供更多的灵活性和自定义操作.

from collections.abc import Callableclass Add:def __call__(self, a, b):return a + b# def func():
#     print(111)# add = Add()
# res = add(1, 2)
# print(res)
# print(isinstance(func, Callable))
# print(isinstance(test_call, Callable))# 类装饰器.# 创建一个装饰器函数,使被装饰的函数只能在特定的时间段内执行。
# 在早上9点 -> 晚上6点之间, 可以调用, 其余时间不允许调用.
import datetimedef time_limited(start, end):def outer(func):def inner(*args, **kwargs):now = datetime.datetime.now().time()if start < now < end:result = func(*args, **kwargs)return resultelse:print(f"对不起, 该时间段无法调用此接口.")return innerreturn outerclass TimeLimit:def __init__(self, start, end):self.start = startself.end = enddef __call__(self, f):def inner(*args, **kwargs):now = datetime.datetime.now().time()if self.start < now < self.end:result = f(*args, **kwargs)return resultelse:print(f"对不起, 该时间段无法调用此接口.")return inner# @time_limited(start=datetime.time(9, 0), end=datetime.time(18, 0))
@TimeLimit(start=datetime.time(9, 0), end=datetime.time(18, 0))
def ceshi():print('我只能在特定的时间段内执行.')if __name__ == '__main__':ceshi()

8. 运算符

运算符魔法方法是用于实现对象之间的比较和关系运算的.它们允许你定义自定义的比较操作, 使你的对象可以像内置类型一样进行大小比较、相等性检查等操作.

下面是一些常用的运算符类型的魔法方法及其解释:

  • __lt__(self, other): 小于运算符 < 的魔法方法.定义对象小于另一个对象时的行为.
  • __le__(self, other): 小于等于运算符 <= 的魔法方法.定义对象小于等于另一个对象时的行为.
  • __eq__(self, other): 等于运算符 == 的魔法方法.定义对象相等时的行为.
  • __ne__(self, other): 不等于运算符 != 的魔法方法.定义对象不等于另一个对象时的行为.
  • __gt__(self, other): 大于运算符 > 的魔法方法.定义对象大于另一个对象时的行为.
  • __ge__(self, other): 大于等于运算符 >= 的魔法方法.定义对象大于等于另一个对象时的行为.
import randomclass IntNumber:def __init__(self):self.value = random.randint(1, 10000)def __str__(self):return f"{self.value}"def __gt__(self, other):return self.value > other.valuedef __eq__(self, other):return self.value == other.valuedef __add__(self, other):return self.value + other.valueclass FloatNumber:def __init__(self):self.value = random.uniform(1, 10000)def __str__(self):return f"{self.value}"def __lt__(self, other):return self.value < other.valueint_number = IntNumber()
int_number2 = IntNumber()
print(int_number + int_number2)
# float_number = FloatNumber()
# print(int_number)
# print(int_number2)
# print(float_number)
# print(int_number2 != int_number)
# print(int_number is float_number)class Date:def __init__(self, year, month, day):self.year = yearself.month = monthself.day = daydef __gt__(self, other):if self.year > other.year:return Trueif self.year == other.year:if self.month > other.month:return Trueelif self.month == other.month:return self.day > other.dayelse:return Falseif self.year < other.year:return Falsedef __eq__(self, other):return self.year == other.year and self.month == other.month and self.day == other.day# date1 = Date(2022, 7, 15)
# date2 = Date(2022, 7, 15)
#
# print(date1 == date2)
遇见安然遇见你,不负代码不负卿。
谢谢老铁的时间,咱们下篇再见~

相关文章:

31天Python入门——第20天:魔法方法详解

你好&#xff0c;我是安然无虞。 文章目录 魔法方法1. __new__和__del__2. __repr__和__len__3. __enter__和__exit__4. 可迭代对象和迭代器5. 中括号[]数据操作6. __getattr__、__setattr__ 和 __delattr__7. 可调用的8. 运算符 魔法方法 魔法方法: Python中的魔法方法是一类…...

ubantu22.04中搭建地图开发环境(qt5.15.2 + osg3.7.0 + osgearth3.7.1 + osgqt)

一、下载安装qt5.15.2 二、下载编译安装osg3.7.0 三、下载编译安装osgearth3.7.1 四、下载编译安装osgqt 五、二三维地图显示demo开发 六、成果展示&#xff1a; 已有功能&#xff1a;加载了dom影像、可以进行二三维地图切换显示、二维地图支持缩放和平移、三维地图支持旋转…...

Linux驱动开发 块设备

目录 序言 1.块设备结构 分区(gendisk) 请求(request) 请求队列 1. 多队列架构 2. 默认限制与扩展 bio 2.块设备的使用 头文件与宏定义 blk-mq 相关结构和操作 块设备操作函数 模块初始化函数 模块退出函数 3.总结 序言 块设备&#xff08;如硬盘、虚拟盘&#x…...

简易Minecraft python

废话多说 以下是一个基于Python和ModernGL的简化版3D沙盒游戏框架。由于代码长度限制&#xff0c;这里提供一个核心实现&#xff08;约500行&#xff09;&#xff0c;您可以通过添加更多功能和内容来扩展它&#xff1a; python import pygame import moderngl import numpy a…...

Bethune X 6发布:为小规模数据库环境打造轻量化智能监控巡检利器

3月31日&#xff0c;“奇点时刻・数智跃迁 -- 云和恩墨2025春季产品发布会”通过视频号直播的方式在线上举办。发布会上&#xff0c;云和恩墨副总经理熊军正式发布 zCloud 6.7和zData X 3.3两款产品新版本&#xff0c;同时也带来了 Bethune X 6——这款面向小规模数据库环境的智…...

OpenCV 图形API(15)计算两个矩阵(通常代表二维向量的X和Y分量)每个对应元素之间的相位角(即角度)函数phase()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 cv::gapi::phase 是 OpenCV 的 G-API 模块中的一个函数&#xff0c;用于计算两个矩阵&#xff08;通常代表二维向量的X和Y分量&#xff09;每个对应元…...

一文理解什么是中值模糊

目录 中值模糊的概念 中值模糊&#xff08;Median Blur&#xff09; 中值模糊的原理 示例&#xff1a;33 中值模糊 什么是椒盐噪声 椒盐噪声&#xff08;Salt-and-Pepper Noise&#xff09; 椒盐噪声的特点 OpenCV 中的 cv2.medianBlur() 函数格式 示例代码 中值模糊…...

游戏引擎学习第192天

仓库:https://gitee.com/mrxiao_com/2d_game_4 回顾 我们现在正在编写一些界面代码&#xff0c;主要是用户界面&#xff08;UI&#xff09;&#xff0c;不过这里的UI并不是游戏内的用户界面&#xff0c;而是为开发者设计的用户界面。我们正在尝试做一些小的UI元素&#xff0c…...

通信数据记录仪-产品概念ID

总结: 1、支持高速CAN、支持容错CAN、支持单线CAN(理解是支持不同的协议,CANFD、CAN2.0和LIN?) 2、 通过上位机设计时间...

Mac VM 卸载 win10 安装win7系统

卸载 找到相应直接删除&#xff08;移动到废纸篓&#xff09; 可参考&#xff1a;mac如何卸载虚拟机win 下载 win7下载地址...

基于图扑 HT 技术的电缆厂 3D 可视化管控系统深度解析

在当今数字化浪潮席卷制造业的大背景下&#xff0c;图扑软件&#xff08;Hightopo&#xff09;凭借其自主研发的强大技术&#xff0c;为电缆厂打造了一套先进的 3D 可视化管控系统。该系统基于 HT for Web 技术&#xff0c;为电缆厂的数字化转型提供了有力支撑。 HT 技术核心架…...

《AI大模型开发笔记》MCP快速入门实战(一)

目录 1. MCP入门介绍 2. Function calling技术回顾 3. 大模型Agent开发技术体系回顾 二、 MCP客户端Client开发流程 1. uv工具入门使用指南 1.1 uv入门介绍 1.2 uv安装流程 1.3 uv的基本用法介绍 2.MCP极简客户端搭建流程 2.1 创建 MCP 客户端项目 2.2 创建MCP客户端…...

C++多态:从青铜九鼎到虚函数表的千年演化密码

一、青铜礼器中的多态启示——九鼎的形与神 在故宫博物院深处&#xff0c;九尊青铜鼎静静矗立。这些跨越三千年的礼器&#xff0c;表面斑驳的铜锈下隐藏着惊人的铸造工艺&#xff1a;鼎足采用分铸法预制&#xff0c;器身主体采用浑铸法一次成型&#xff0c;纹饰运用浮雕与阴刻…...

【愚公系列】《高效使用DeepSeek》051-产品创新研发

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...

常见的ETL工具分类整理

一、开源ETL工具 ‌Kettle&#xff08;Pentaho Data Integration&#xff09;--Spoon‌ 设计及架构&#xff1a;面向数据仓库建模的传统ETL工具。使用方式&#xff1a;C/S客户端模式&#xff0c;开发和生产环境需要独立部署&#xff0c;任务编写、调试、修改都在本地。底层架构…...

Smart Link 技术全面解析

1.1 网络冗余技术的演进与需求 1.2 Smart Link 的核心价值与本文目标 第一章 Smart Link 技术概述 2.1 Smart Link 的应用场景与背景 2.2 Smart Link 的基本概念与组网角色 2.3 Smart Link 与传统技术的对比 第二章 Smart Link 工作原理 3.1 Smart Link 组的构成与运行机…...

React面试常考内容【从宏观到微观】

以下是React面试常考内容的系统梳理,从宏观设计思想到微观实现细节,涵盖高频考点及底层原理: 一、宏观层面:React设计哲学与架构 核心设计理念 • 声明式编程:通过描述UI的最终状态而非操作步骤实现高效开发(如JSX声明结构) • 组件化思想:高内聚低耦合的组件构建模式,…...

栈回溯和离线断点

栈回溯和离线断点 栈回溯&#xff08;Stack Backtrace&#xff09; 栈回溯是一种重建函数调用链的技术&#xff0c;对于分析栈溢出的根本原因非常有价值。 实现方式 // 简单的栈回溯实现示例&#xff08;ARM Cortex-M架构&#xff09; void stack_backtrace(void) {uint32_…...

Roo Code(前身为 Roo Cline)一个 AI 驱动的自主编码代理

Roo Code&#xff08;前身为 Roo Cline&#xff09; Roo Code 是一个 AI 驱动的自主编码代理&#xff0c;它存在于您的编辑器中。它可以&#xff1a; 用自然语言沟通直接在您的工作区读写文件运行终端命令自动化浏览器操作与任何 OpenAI 兼容或自定义的 API/模型集成通过自定…...

数字化三维实训室:无穿戴动作捕捉技术如何赋能体育与舞蹈

在高校体育与舞蹈教学中&#xff0c;精准的动作训练至关重要。传统训练方式依赖教练的肉眼观察与手动记录&#xff0c;存在效率低下、误差较大的情况。尤其在快速连续动作或复杂肢体形态的捕捉中&#xff0c;人工判读易受主观经验限制&#xff0c;难以实现标准化评估。面对传统…...

Linux make与makefile 项目自动化构建工具

本文章将对make与makefile进行一些基础的讲解。 假设我们要建造一座房子&#xff0c;建造过程涉及很多步骤&#xff0c;比如打地基、砌墙、安装门窗、粉刷墙壁等。每个步骤都有先后顺序&#xff0c;并且有些步骤可能依赖于其他步骤的完成。比如&#xff0c;你必须先打好地基才…...

leetcode51-N皇后

leetcode 51 思路 本题可以使用回溯算法来解决。回溯算法通过尝试所有可能的解决方案来找到问题的解的算法&#xff0c;当发现当前的选择无法得到有效的解决方案时&#xff0c;就回溯到上一步&#xff0c;尝试其他的选择。对于 N 皇后问题&#xff0c;我们可以逐行放置皇后&…...

linux 命令 awk

awk 是 Linux/Unix 系统中一个强大的文本处理工具&#xff0c;尤其擅长处理结构化文本数据&#xff08;如日志、表格数据&#xff09;。它不仅是命令行工具&#xff0c;还是一种脚本语言&#xff0c;支持变量、条件、循环等编程特性 1. 基本语法 awk [选项] 模式 {动作} 文件名…...

接口自动化学习四:全量字段校验

什么是全量字段校验&#xff1a; 校验接口返回响应结果的全部字段&#xff08;更进一步的断言&#xff09;。 校验内容&#xff1a; 1.字段值 2.字段名或者字段类型 校验流程&#xff1a; 1.定义 校验规则&#xff08;json语法&#xff0c;只能针对json对象校验&#xff0c;如…...

R语言——获取数据1

参考资料&#xff1a;学习R 数据的来源可以由很多。R内置有许多数据集&#xff0c;而在其他的附件包中能找到更多的数据。R能从各式各样的来源中读取&#xff0c;且支持大量的文件格式。 1、内置的数据集 R的基本分发包有一个datasets&#xff0c;里面全是示例数据集。很多其他…...

自编码器(AutoEncoder)概念解析与用法实例:压缩数字图像

目录 1. 前言 2. 自编码器的基本概念 2.1 自编码器的结构 2.2 损失函数 3. 使用 PyTorch 构建自编码器&#xff1a;压缩数字图像 3.1 导入必要的库 3.2 定义自编码器模型 3.3 准备数据集 3.4 训练模型 3.5 可视化重建结果 3.6 完整代码 4. 自编码器的应用场景 5. …...

从零开始打造HTML5拼图游戏:一个Canvas实战项目

从零开始打造HTML5拼图游戏&#xff1a;一个Canvas实战项目 先看效果&#xff1a; 你是否曾经被那些精美的网页拼图游戏所吸引&#xff1f;用 HTML5 的 Canvas 技术&#xff0c;从零开始&#xff0c;教你怎么画图、处理鼠标事件&#xff0c;还有游戏的核心逻辑&#xff0c…...

每日一题洛谷P8649 [蓝桥杯 2017 省 B] k 倍区间c++

P8649 [蓝桥杯 2017 省 B] k 倍区间 - 洛谷 (luogu.com.cn) #include <iostream> #include <vector> using namespace std; #define int long long signed main() {int n, k;cin >> n >> k;vector<int> a(n 1);vector<int> sum(n 1);vec…...

在uniapp中,video比普通的标签层级高解决问题

<view style"position: relative;"><video style"position: absolute;z-index:-1"></video><view style"position: absolute;z-index:999"></view> </view> 上面代码并没有解决view的层级比video高的问题&…...

《探索边缘计算:重塑未来智能物联网的关键技术》

最近研学过程中发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…...