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)
遇见安然遇见你,不负代码不负卿。
谢谢老铁的时间,咱们下篇再见~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

栈 —— 数据结构基础刷题路程

一、P1739 表达式括号匹配 - 洛谷 算法代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N300008; struct mystack {int a[N];int t-1;//压栈void push(int data){a[t]data; } //取栈顶元素int top(){return a[t]; } //弹出栈顶元素void pop(){i…

瑞昱RTD2556QR显示器驱动芯片

一、概述 RTD2556QR芯片是由Realtek公司精心研发的一款高性能显示驱动芯片&#xff0c;专为满足现代显示设备对高分辨率、多功能接口及稳定性能的需求而设计。该芯片凭借其卓越的技术特性和广泛的应用领域&#xff0c;在显示驱动市场中占据重要地位。它集成了多种先进的功能模…

PyQt5和OpenCV车牌识别系统

有需要请加文章底部Q哦 可远程调试 PyQt5和OpenCV车牌识别系统 一 介绍 此车牌识别系统基于PyQt5和OpenCV开发&#xff0c;蓝牌&#xff0c;新能源(绿牌)&#xff0c;黄牌&#xff0c;白牌均可以准确识别&#xff0c;支持中文识别&#xff0c;可以导出识别结果(Excel格式)。此…

学有所记- 探索FastAPI在docker上的部署

目标&#xff1a; 学习怎样在docker中安装部署FastAPI&#xff0c;完成项目结构的搭建以及hello world的运行 背景&#xff1a; 公司内服务器资源有限&#xff0c;为了共享算力资源&#xff0c;同时又能隔离运行环境&#xff0c;因此采用了docker部署的方式&#xff0c;进行各…

HTTP keepalive 详解

一、简介 HTTP协议早期版本&#xff0c;比如1.0&#xff0c;默认是不使用持久连接的&#xff0c;也就是每个请求/响应之后都会关闭TCP连接。这样的话&#xff0c;每次请求都需要重新建立连接&#xff0c;增加了延迟和资源消耗。Keep-Alive的作用是保持连接&#xff0c;让多个请…

长短期记忆神经网络(LSTM)基础学习与实例:预测序列的未来

目录 1. 前言 2. LSTM的基本原理 2.1 LSTM基本结构 2.2 LSTM的计算过程 3. LSTM实例&#xff1a;预测序列的未来 3.1 数据准备 3.2 模型构建 3.3 模型训练 3.4 模型预测 3.5 完整程序预测序列的未来 4. 总结 1. 前言 在深度学习领域&#xff0c;循环神经网络&…

基于机器学习的三国时期诸葛亮北伐失败因素量化分析

一、研究背景与方法论 1.1 历史问题的数据化挑战 三国时期&#xff08;220-280年&#xff09;的战争史存在史料分散、数据缺失的特点。本研究通过构建包含军事、经济、地理、政治四大维度的结构化数据库&#xff0c;收录建安十二年&#xff08;207年&#xff09;至建兴十二年…

蓝桥杯省模拟赛 数位和

问题描述 只能被 1 和本身整除的数称为质数。 请问在 1 &#xff08;含&#xff09;到 1000000 &#xff08;含&#xff09;中&#xff0c;有多少个质数的各个数位上的数字之和为 23 。 提示&#xff1a;599 就是这样一个质数&#xff0c;各个数位上的数字之和为 59923 。 #…

Timer的底层实现原理?

Timer 是 Java 中用于定时任务调度的基础工具类,其底层实现基于 单线程+任务队列 的模型。以下是 Timer 的底层实现原理的详细分析: 一、核心组件 TimerThread 继承自 Thread,是 Timer 的工作线程,负责从队列中提取任务并执行。通过 while (true) 循环持续检查任务队列。Ta…

Java 枚举类 Key-Value 映射的几种实现方式及最佳实践

Java 枚举类 Key-Value 映射的几种实现方式及最佳实践 前言 在 Java 开发中&#xff0c;枚举(Enum)是一种特殊的类&#xff0c;它能够定义一组固定的常量。在实际应用中&#xff0c;我们经常需要为枚举常量添加额外的属性&#xff0c;并实现 key-value 的映射关系。本文将详细…

青少年编程与数学 02-015 大学数学知识点 01课题、概要

青少年编程与数学 02-015 大学数学知识点 01课题、概要 一、线性代数二、概率论与数理统计三、微积分四、优化理论五、离散数学六、数值分析七、信息论 《青少年编程与数学》课程要求&#xff0c;在高中毕业前&#xff0c;尽量完成大部分大学数学知识的学习。一般可以通过线上课…

智能打印预约系统:微信小程序+SSM框架实战项目

微信小程序打印室预约系统&#xff0c;采用SSM&#xff08;SpringSpringMVCMyBatis&#xff09;经典框架组合。 一、系统核心功能详解 1. 智能化管理后台 ​用户数据看板​打印店资源管理​预约动态监控​服务评价系统 2. 微信小程序端 ​智能定位服务​预约时段选择​文件…

DataX 3.0 实战案例

第五章 实战案例 5.1. 案例一 5.1.1. 案例介绍 MySQL数据库中有两张表&#xff1a;用户表(users)&#xff0c;订单表(orders)。其中用户表中存储的是所有的用户的信息&#xff0c;订单表中存储的是所有的订单的信息。表结构如下&#xff1a; 用户表 users: id&#xff1a;用…

设计模式学习(1)

面向对象设计原则 单一职责 每个类只有一个职责&#xff0c;并被完整的封装在类中&#xff0c;该原则用来控制类的粒度。 例如Mapper&#xff0c;controller都只负责一个业务。 开闭原则 应该对扩展开放&#xff0c;而对修改封闭&#xff0c;例如定义接口或是抽象类作为抽…

在 Rocky Linux 9.2 上编译安装 Redis 6.2.6

文章目录 在 Rocky Linux 9.2 上编译安装 Redis 6.2.6Redis 介绍官网Redis 的核心特性高性能支持多种数据结构多种持久化机制复制与高可用2.5 事务与 Lua 脚本消息队列功能 Redis 适用场景Redis 与其他数据库对比Redis 的优势与劣势Redis 优势Redis 劣势 部署过程系统环境信息环…

量子计算与经典计算的融合与未来

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

数据结构(4)——带哨兵位循环双向链表

目录 前言 一、带哨兵的循环双向链表是什么 二、链表的实现 2.1规定结构体 2.2创建节点 2.3初始化 2.4打印 2.5检验是否为空 2.6销毁链表 2.7尾插 2.8尾删 2.9头插 2.10头删 2.11寻找特定节点 2.12任意位置插入&#xff08;pos前&#xff09; 2.13删除任意节点 …

Github 2025-03-30 php开源项目日报 Top10

根据Github Trendings的统计,今日(2025-03-30统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10TypeScript项目1Coolify: 开源自助云平台 创建周期:1112 天开发语言:PHP, Blade协议类型:Apache License 2.0Star数量:10527 个Fo…

3. 线程间共享数据

1. 线程共享数据会造成什么问题&#xff1f; 1.1 读写不一致 多线程读不会造成数据变动&#xff0c;所以没有问题。只要有一个线程设计修改数据&#xff0c;就会导致数据共享出现问题&#xff0c;简单的是数据不一致&#xff0c;严重的是程序访问已经释放的内存&#xff0c;造…

JAVA垃圾回收算法和判断垃圾的算法

一、判断垃圾的算法 判断对象是否为垃圾的核心是确定对象是否不再被使用。Java主要采用以下两种算法&#xff1a; 1. 引用计数法&#xff08;Reference Counting&#xff09; 原理&#xff1a;每个对象维护一个引用计数器&#xff0c;记录被引用的次数。当引用被添加时计数器…