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__
的注意点:
- 返回实例对象:
__new__
方法必须返回一个类的实例对象.通常情况下, 它会调用父类的__new__
方法来创建实例, 并返回实例对象. - 第一个参数是类:
__new__
方法的第一个参数是类本身, 通常命名为cls
.在调用时, Python 会自动传递类作为第一个参数. - 控制实例创建过程:
__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()
函数逐个获取元素. - 只能遍历一次, 遍历完成后就不能再次使用.
总结:
- 可迭代对象是具有迭代性质的对象, 而迭代器是一个实现了迭代协议的对象.
- 可迭代对象可以通过
iter()
函数转换为迭代器. - 迭代器是一种一次性的数据获取方式, 每次调用
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__
用于自定义对象的索引访问和操作.它们在创建自定义的容器类时非常有用, 允许你实现类似字典或列表的行为.
-
__getitem__(self, key)
:这个方法定义了使用索引访问对象时的行为.当你像
obj[key]
这样使用索引操作时, Python 会调用对象的__getitem__
方法, 并将索引key
作为参数传递给这个方法.你可以在这个方法中实现对应的行为, 比如从内部数据结构中获取相应的值. -
__setitem__(self, key, value)
:这个方法定义了使用索引赋值操作时的行为.当你像
obj[key] = value
这样进行索引赋值操作时, Python 会调用对象的__setitem__
方法, 并将索引key
和值value
作为参数传递给这个方法.你可以在这个方法中实现对应的赋值行为. -
__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 中的魔法方法, 用于自定义对象的属性访问和操作.它们允许你控制属性的获取、设置和删除行为, 从而实现自定义的属性操作逻辑.
-
__getattr__(self, name)
:当你访问一个不存在的属性时, Python 会调用对象的
__getattr__
方法, 并将属性名name
作为参数传递给这个方法.你可以在这个方法中实现对应的行为, 比如返回一个默认值或者抛出异常. -
__setattr__(self, name, value)
:当你设置属性的值时, Python 会调用对象的
__setattr__
方法, 并将属性名name
和值value
作为参数传递给这个方法.你可以在这个方法中实现对应的赋值行为, 比如进行值的验证或修改. -
__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天:魔法方法详解
你好,我是安然无虞。 文章目录 魔法方法1. __new__和__del__2. __repr__和__len__3. __enter__和__exit__4. 可迭代对象和迭代器5. 中括号[]数据操作6. __getattr__、__setattr__ 和 __delattr__7. 可调用的8. 运算符 魔法方法 魔法方法: Python中的魔法方法是一类…...
WPF 浅述IsHitTestVisible属性
WPF 浅述IsHitTestVisible属性 IsHitTestVisible 属性是 WPF 中一个非常重要的属性,它决定了一个控件是否可以作为 hit test 的一部分被检测到。理解这个属性对于处理交互事件(如鼠标点击、触摸等)非常重要。 IsHitTestVisible 属性的含义&am…...
WSN 经典定位算法
WSN 经典定位算法 包括: Centoid, Bounding_box, Grid_Scan, RSSI, DV_hop, MDS_MAP,APIT-WSN Localization/Amorphous/Amorphous.m , 3351 Localization/APIT/APIT.m , 4169 Localization/APIT/PPIT.m , 3889 Localization/Bounding Box/Bounding_Box.…...
LLM 优化技术(1)——Scaled-Dot-Product-Attention(SDPA)
在 Transformer 中抛弃了传统的 CNN 和 RNN,整个网络结构完全由Scaled Dot Product Attention 和Feed Forward Neural Network组成。一个基于 Transformer 的可训练的神经网络可以通过堆叠 Transformer 的形式进行搭建,Attention is All You Need论文中通…...
【深度学习】嘿马深度学习目标检测教程第1篇:商品目标检测要求、目标,1.1 项目演示【附代码文档】
教程总体简介:要求 目标 1.1 项目演示 学习目标 1.1 图像识别背景 1.2 什么是目标检测 1.2.1 目标检测定义 1.2.1.1 物体 1.3 目标检测应用场景 1.3.1 行业 1.3.2 应用类别 1.4 开发环境搭建 目标检测概述 3.1 目标检测任务描述 3.1.4 目标定位的简单实现 项目实现 …...
【蓝桥杯】单片机设计与开发,RTC实时时钟
一、RTC-DS1302概述 二、BCD码 三、三线协议概述 四、RTC的应用 五、DS1302的驱动函数 六、操作流程 七、三线协议驱动程序...
Java 各版本的新特性
Java 各版本的新特性主要集中在提升开发效率、性能优化、语言功能增强和模块化支持等方面。以下是 JDK 8 到 JDK 21(截至2023年)的主要新特性概览: JDK 8 (2014) - LTS Lambda 表达式:支持函数式编程,简化匿名内部类。…...
OpenGL中EBO的使用及原理
EBO 是什么? 在OpenGL中,EBO(Element Buffer Object),也称为索引缓冲对象 IBO(Index Buffer Object),是一种用于存储顶点索引数据的缓冲区对象。它的核心作用是通过复用顶点数据来减…...
应用分享 | AWG技术突破:操控钻石氮空位色心,开启量子计算新篇章!
利用AWG操作钻石中的氮空位色彩中心 金刚石中的颜色中心是晶格中的缺陷,其中碳原子被不同种类的原子取代,而相邻的晶格位点则是空的。由于色心具有明亮的单光子发射和光学可触及的自旋,因此有望成为未来量子信息处理和量子网络的固态量子发射…...
【Ultralytics YOLO COCO 评估脚本 | 获得COCO评价指标】
文章目录 Ultralytics YOLO COCO 评估脚本 (coco_evaluate.py)1. 描述2. 依赖项3. 使用方法4. 输入文件格式5. 输出6. 注意7. 完整代码 Ultralytics YOLO COCO 评估脚本 (coco_evaluate.py) 这是一个 Python 脚本,用于评估以 COCO JSON 格式提供的目标检测结果。它…...
聊一聊,元件封装知多少?
目录 01 | 简 介 02 | 常见的无源器件封装 03 | 集成(IC)类封装 04 | 功率器件类封装 05 | 连接器类封装 06 | 总 结 01 | 简 介 由于平时工作中,经常需要查看封装的样式,以便初步规划PCB布局;遂萌发对常用的元件封装进行一次总结。 …...
企业需要使用防病毒系统保障数据安全的原因
数据作为企业的重要资产,正面临勒索病毒等极大威胁。在复杂严峻的网络安全形势下,企业的业务运营、数据安全和声誉遭遇诸多来自网络的挑战。2023年,国内发生多起严重网络安全事件,例如数据库漏洞导致数据泄露、钓鱼邮件窃取信息、…...
使用无人机进行露天矿运输道路分析
使用无人机进行露天矿运输道路分析 无人机正在彻底改变采矿业,为露天矿场的运输道路收集数据和分析提供了一种新方法。通过使用 UAS 技术,采矿公司可以更全面地了解道路状况,确定磨损区域,并提高安全性和效率。 本文介绍了无人机用…...
基于Vue.js网页开发相关知识:Vue-router
一、基础知识 vue-router 是 Vue.js 官方的路由管理器,用于实现单页面应用(SPA)的路由功能。以下从几个方面对 vue-router 进行详细分析: 1. 核心概念 路由配置 vue-router 通过定义路由配置对象来管理应用的路由。每个路由配置…...
同时使用Telnet和SSH登录思科交换机
同时使用Telnet和SSH登录思科交换机 1. 配置管理IP地址 首先,为交换机配置一个管理IP地址,以便可以通过网络进行远程管理: Switch(config)# interface vlan [VLAN_ID] Switch(config-if)# ip address [IP地址] [子网掩码] Switch(config-i…...
presto行转列
presto的行列转换和spark、hive一样也是通过外链语句实现的,只不过语法和关键子有点不同,如下 with tmp1 as (select 1,2,3 as a1,4,5,6 as a2 ) select * from tmp1 cross join unnest(split(tmp1.a1, ,),split(tmp1.a2, ,) ) as b(a1s,a2s) 结果如下...
App Usage v5.57 Pro版 追踪手机及应用使用情况
手机使用监控神器:让你的手机使用情况一目了然 现代人的生活已经离不开手机——通讯、娱乐、支付、购物…每天我们花在手机上的时间越来越多。你是否好奇: 每天在各个应用上花费了多少时间?一天中查看了多少次手机?哪些应用在后…...
24.3 CogView3多模态生成实战:从API调优到1024高清图像生成全解析
CogView3多模态生成实战:从API调优到1024高清图像生成全解析 CogView3 & CharGLM:多模态生成技术深度解析 关键词:CogView3 API 调用,图像生成与编辑,多模态提示工程,GLM 技术栈集成,参数优化策略 1. 智谱清言平台演示 CogView-3 核心能力 1.1 CogView3 技术架构…...
操作系统高频(六)linux内核
操作系统高频(六)linux内核 1.内核态,用户态的区别⭐⭐⭐ 内核态和用户态的区别主要在于权限和安全性。 权限:内核态拥有最高的权限,可以访问和执行所有的系统指令和资源,而用户态的权限相对较低&#x…...
Ubuntu系统安装Cpolar 实现内网穿透教程
文章目录 方法 1:使用官方脚本快速安装(推荐)方法 2:手动下载安装包配置与使用常见问题 方法 1:使用官方脚本快速安装(推荐) 下载安装脚本 打开终端,执行以下命令下载并运行安装脚本…...
Trustworthy Machine Learning
1. 可信任机器学习的核心概念 1.1 可信任性的定义 稳健性(Robustness): 机器学习模型在面对数据噪声、分布变化或对抗性攻击时仍能维持其预测性能的能力。 公平性(Fairness): 避免 AI 决策对某些群体存在…...
Enovia许可管理系统的特点
在当今竞争激烈的市场环境中,企业对于产品生命周期管理(PLM)的需求日益增加。Enovia许可管理系统,作为一款先进的许可证管理工具,凭借其卓越的特点,助力企业实现资源的高效管理和最大化利用。本文将详细介绍…...
【CSS】样式与效果
个人主页:Guiat 归属专栏:HTML CSS JavaScript 文章目录 1. CSS盒模型1.1 盒模型基础1.2 盒模型类型1.2.1 标准盒模型1.2.2 IE盒模型 2. CSS选择器2.1 基本选择器2.2 组合选择器2.3 伪类和伪元素 3. CSS布局技术3.1 Flexbox布局3.2 Grid布局3.3 定位 4. …...
Python中常用网络编程模块
学习籽料在下方自拿 一、网络基础 网络由下往上分为:物理层、数据链路层、网络怪、传输层、会话层、表示层和应用层。 TCP/IP协议是传输层协议,主要解决数据如何在网络中传输;socket则是对TCP/IP协议的封装,它本身不是协议&…...
python-flask
1.定时任务的时候一定要加--preload,防止 --preload gunicorn --config gunicorn-conf.py --preload index:app 2.source /usr/local/nginx/html/prod/pypd/venv/bin/activate 启动linux的python环境 3.pip freeze > requirements.txt 生成所有依赖 4.p…...
OpenIPC开源FPV之Adaptive-Link信号干扰
OpenIPC开源FPV之Adaptive-Link信号干扰 1. 源由2. 现象3. 分析3.1 冲突弃包3.2 传输丢包 4. 逻辑4.1 可调整参数4.2 可监测参数4.3 逻辑思路 5. 总结6. 参考资料 1. 源由 虽然,OpenIPC作为FPV图传在延时方面使用广播wfb-ng,性能上已经非常棒了。 在权…...
C++ 结构体与函数
一.结构体 1.概念: 结构体(struct)是一种用户自定义复合数据类型,其中可以包含不同类型的不同成员 2.结构体的应用场景: 我们在使用多个变量描述一个对象时,虽然也可以做到,但是难免显得杂乱…...
【Java全栈】Java + Vue 项目框架与运行流程详解
文章目录 ⭐前言⭐一、框架介绍🌟1、后端框架(Java Spring Boot)🌟2、前端框架(Vue 3 Element Plus) ⭐二、项目结构🌟1、后端目录(Spring Boot)🌟2、前端目…...
JAVA:利用 JSONPath 操作JSON数据的技术指南
1、简述 JSONPath 是一种强大的工具,用于查询和操作 JSON 数据。类似于 SQL 的语法,它为处理复杂的 JSON 数据结构提供了简单且高效的解决方案。✨ 代码样例:https://gitee.com/lhdxhl/springboot-example.git 本文将介绍 JSONPath 的基本…...
5.2.1 WPF 通过ItemControl自己做柱状图
1. 最终效果如下图: 1.1 准备数据 ViewModel public class PrimaryItemModel{public double Value { get; set; }public string XLabel { get; set; }}public class MainViewModel{public ObservableCollection<PrimaryItemModel> PrimaryList { get; set; }…...
3.31 代码随想录第三十一天打卡
1049.最后一块石头的重量II (1)题目描述: (2)解题思路: class Solution { public:int lastStoneWeightII(vector<int>& stones) {vector<int> dp(15001, 0);int sum 0;for (int i 0; i < stones.size(); i) sum stones[i];int target sum / 2;for (in…...
基于网启PXE服务器的批量定制系统平台
一.项目背景 公司新购了一批服务器和台式机,需要为台式机和服务器安装系统,一部分需要安装国产OpenEuler,一部分要求安装CentOS 7.9,同时也要满足定制化需求,即按要求分区安装相应软件。 二.项目环境 安装win10/11 …...
Unity光线传播体积(LPV)技术实现详解
一、LPV技术概述 光线传播体积(Light Propagation Volumes)是一种实时全局光照技术,通过将场景中的间接光信息存储在3D网格中,实现动态物体的间接光照效果。 核心优势: 实时性能:相比传统光照贴图,支持动态场景 硬件…...
蓝桥杯备考---》贪心算法之矩阵消除游戏
我们第一次想到的贪心策略一定是找出和最大的行或者列来删除,每次都更新行和列 比如如图这种情况,这种情况就不如直接删除两行的多,所以本贪心策略有误 so我们可以枚举选的行的情况,然后再贪心的选择列和最大的列来做 #include …...
python+playwright 学习-93 结合pands 抓取网页表格数据
playwright 结合 pands 抓取网页表格数据 pandas 直接抓取网页表格数据 web 网页表格数据 """ 上海 202501 天气抓取 """ import pandas as pddf = pd.read_html(fhttp://www.tianqihoubao.com/lishi/shanghai/month/202501.html,encoding...
MVC编程
MVC基本概述 例子——显示本地文件系统结构 先分别拖入ListView,TableView,TreeView 然后在进行布局 在widget.cpp 结果 mock测试 1,先加入json测试对象 2.创建后端目录 3,在src添加新文件 在models文件夹里 在mybucket.h,添加测试用例的三个字段 4.在…...
51单片机总结
写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.03.31 51单片机学习总结(有感而发) 一、总结结语 一、总结 一路…...
端到端语音识别案例
《DeepSeek大模型高性能核心技术与多模态融合开发(人工智能技术丛书)》(王晓华)【摘要 书评 试读】- 京东图书 语音识别这一技术正如其名,是通过精密地解析说话人的语音来识别并准确转写出其所说的内容。它不仅仅是一个简单的转录过程&#…...
iOS自定义collection view的page size(width/height)分页效果
前言 想必大家工作中或多或少会遇到下图样式的UI需求吧 像这种cell长度不固定,并且还能实现的分页效果UI还是很常见的 实现 我们这里实现主要采用collection view,实现的方式是自定义一个UICollectionViewFlowLayout的子类,在这个类里对…...
CI/CD基础知识
什么是CI/CD CI:持续集成,开发人员频繁地将代码集成到主干(主分支)中每次集成都通过自动化构建和测试来验证,从而尽早发现集成错误,常用的CI工具包括Jenkins、Travis CI、CircleCI、GitLab CI等 CD&#…...
MySQL 的 SQL 语句执行顺序
MySQL 的 SQL 语句执行顺序并不完全按照代码的书写顺序执行,而是遵循一套固定的逻辑流程 1. FROM 和 JOIN 作用:确定查询的数据来源,包括表和它们的连接方式(如 INNER JOIN, LEFT JOIN 等)。 细节: 先执行…...
Dubbo(21)如何配置Dubbo的注册中心?
在分布式系统中,注册中心是一个关键组件,用于服务的注册和发现。Dubbo 支持多种注册中心,包括 ZooKeeper、Nacos、Consul、Etcd 等。下面详细介绍如何配置 Dubbo 的注册中心,以 ZooKeeper 为例。 配置步骤 引入依赖:…...
AISEO中的JSON 如何部署?
一、JSON 是什么? JSON(JavaScript Object Notation) 是一种轻量级的数据格式,用于在不同系统之间传递结构化信息。它的核心特点是: 易读:用简单的 {键: 值} 对表示数据,例如: json…...
力扣hot100——最长连续序列(哈希unordered_set)
题目链接:最长连续序列 1、错解:数组做哈希表(内存超出限制) int longestConsecutive(vector<int>& nums) {vector<bool> hash(20000000010, false);for(int i0; i<nums.size();i){hash[1000000000nums[i]]t…...
几种常见的.NET单元测试模拟框架介绍
目录 1. Moq 2. NSubstitute 3. AutoFixture 4. FakeItEasy 总结对比 单元测试模拟框架是一种在软件开发中用于辅助单元测试的工具。 它的主要作用是创建模拟对象来替代真实对象进行测试。在单元测试中,被测试的代码可能依赖于其他组件或服务,如数…...
装饰器模式与模板方法模式实现MyBatis-Plus QueryWrapper 扩展
pom <dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId> <!-- MyBatis 联表查询 --> </dependency>MPJLambdaWrapperX /*** 拓展 MyBatis Plus Join QueryWrapper 类&…...
11-SpringBoot3入门-整合aop
1、概念(个人理解) AOP(Aspect Oriented Programming),面向切面编程。 1)切面(Aspect):提供切入连接点的方法 2)连接点(Joinpoint)…...
naive_admin项目实战03 基于Go语言的后端
01.使用Goland打开项目 02.使用Goland连接MySQL 03.执行SQL脚本 set names utf8mb4; set foreign_key_checks 0;-- ---------------------------- -- table structure for permission -- ---------------------------- drop table if exists permission; create table permiss…...
基于卷积神经网络的眼疾识别系统,resnet50,efficentnet(pytorch框架,python代码)
更多图像分类、图像识别、目标检测、图像分割等项目可从主页查看 功能演示: 眼疾识别系统resnet50,efficentnet,卷积神经网络(pytorch框架,python代码)_哔哩哔哩_bilibili (一)简介…...
Python数据可视化-第1章-数据可视化与matplotlib
环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容,本章为第1章 数据可视化与matplotlib 本文主要介绍了什么是数据集可视化,数据可视化的目的,常见的数据可视化方式…...