Python--类【详细教程】

在这里插入图片描述

类的介绍

面向对象编程(object-oriented programming,OOP)是最有效的软件编写方法之⼀。在面向对象编程中,你编写表示现实世界中的事物的类(class),并基于这些类来创建对象(object)。
根据类来创建对象称为实例化,这让你能够使⽤类的实例(instance)。

1.创建和使用类

下面编写⼀个表示小狗的类 Dog ——它表示的不是特定的小狗,而是小狗的抽象类型。
小狗具备两项信息(名字和年龄)和两种行为(坐下和打滚)。
编写这个类后,我们将使⽤它来创建表⽰特定⼩狗的实例 。

1.1 创建Dog类

class Dog: #类名一般首字母大写             """小狗类的定义"""def __init__(self, name, age):        """初始化属性 name 和 age"""self.name = name                  self.age = agedef sit(self):                       """模拟⼩狗收到命令时坐下"""print(f"{self.name} 现在坐下了.")def roll_over(self):"""模拟⼩狗收到命令时打滚"""print(f"{self.name} 正在打滚!")

第1行,定义一个Dog类 ,class是类关键字,类名首字母大写.

init() 方法

第4行,init() 方法,两边都有两个下划线 , 类中的函数称为方法,它是⼀个特殊方法,每当你根据 Dog 类创建新实例时,Python 都会自动运行它。
在这里将 init() 方法定义成包含三个形参:self、name 和 age。
在类方法的定义中,形参 self (名字可以改变)必不可少,而且必须位于其他形参的前面。
为何必须在方法定义中包含形参 self 呢?因为当 Python 调用这个方法来创建 Dog 实例时,将自动把实例本身传入实参 self,该实参是⼀个指向实例本身的引用,让实例能够访问类中的属性和方法。当我们创建 Dog 实例时,Python 将调用Dog类的 init() 方法。我们将通过实参向 Dog() 传递名字和年龄;self 则会自动传递,因此不需要我们来传递。每当我们根据 Dog 类创建实例时,都只需给最后两个形参(name 和 age)提供值。
以self为前缀的变量可供类中的所有方法使用,可以通过类的任意实例来访问。
self.name = name 把形参 name 的值,并将其赋给当前实例的name属性。self.age = age 的作用与此类似。像这样可通过实例访问的变量称为属性(attribute)。
Dog 类还定义了另外两个方法:sit() 和 roll_over()(见第9行和第13行)。由于这些方法执行时不需要额外的信息,因此只有⼀个形参 self。

1.2 创建实例
可以将类视为有关如何创建实例的说明。例如,Dog 类就是⼀系列说明,让 Python 知道如何创建表示特定小狗的实例。
下面创建⼀个表示特定小狗的实例:

class Dog:"""小狗类的定义"""def __init__(self, name, age):"""初始化属性 name 和 age"""self.name = nameself.age = agedef sit(self):"""模拟⼩狗收到命令时坐下"""print(f"{self.name} 现在坐下了.")def roll_over(self):"""模拟⼩狗收到命令时打滚"""print(f"{self.name} 正在打滚!")dog1 = Dog("来福",3); #创建一个Dog实例
dog1.sit() 
dog1.roll_over()

在第17行,我们让 Python 创建⼀条名字为"来福"、年龄为 3 的小狗.
调用实例方法
Dog类创建实例后,通过实例就能使用点号来调用 Dog 类中定义的任何方法了。
访问权限
在Python中,与一些其他面向对象编程语言(如Java或C++)不同,Python没有访问权限修饰符(如public、protected、private)。然而,Python社区遵循一种约定俗成的命名规范来指示属性的“访问权限”,这不是语言强制的。
1. 公有(Public)

公有属性和方法是公开的,可以被类的任何实例直接访问和修改。

命名约定:不以单下划线(_)和双下划线(__)开头的属性或方法名都被视为公有的。
2. 受保护(Protected)

Python中并没有受保护(protected)属性或方法的关键字,但遵循命名约定,

命名约定:以单个下划线(_)开头的属性或方法名被视为“受保护的”或“内部使用的”,暗示这些属性或方法不应该被类的外部直接使用。

尽管如此,从技术上说,这些“受保护的”属性或方法仍然是可以被外部访问的,因为它们没有真正的访问限制。
3. 私有(Private)

私有属性和方法是以双下划线(__)开头的。Python会对这些属性或方法进行名称改写(name mangling),以阻止它们被类的外部直接访问。

名称改写意味着私有属性的实际名称会包含类名作为前缀,并转换为小写。例如,如果类名为MyClass,并且有一个私有属性名为__private_attr,那么它的实际名称会是_MyClass__private_attr。

尽管如此,私有属性仍然可以被类的内部方法(包括继承自父类的方法)通过self.__private_attr的形式访问,但这种机制主要是为了提供一定程度的封装,而不是严格的访问控制。

1.3 创建多个实例

可根据需要创建任意数量的实例.如下:

class Dog:"""小狗类的定义"""def __init__(self, name, age):"""初始化属性 name 和 age"""self.name = nameself.age = agedef sit(self):"""模拟⼩狗收到命令时坐下"""print(f"{self.name} 现在坐下了.")def roll_over(self):"""模拟⼩狗收到命令时打滚"""print(f"{self.name} 正在打滚!")dog1 = Dog("来福",3);
dog1.sit()
dog1.roll_over()dog2 = Dog("旺财",4);
dog2.sit()
dog2.roll_over()

2.使用类和实例

类编写好后,就可以创建实例。而修改实例的属性是重要功能之一。你既可以直接修改实例的属性,也可以编写方法来进行修改。

2.1 car类

下面编写⼀个表示汽车的类,它存储了有关汽车的信息,并提供了⼀个汇总这些信息的方法:


class Car:"""⼀次模拟汽⻋的简单尝试"""def __init__(self, make, model, year):"""初始化描述汽⻋的属性"""self.make = make   #产商self.model = model #型号self.year = year   #出厂年份def get_descriptive_name(self):"""返回格式规范的描述性信息"""long_name = f"{self.year} {self.make} {self.model}"return long_namemy_new_car = Car('奥迪', 'A4', 2024)
print(my_new_car.get_descriptive_name())

在创建 Car 实例时,需要指定其制造商、型号和生产年份。
为了让这个类更有趣,下面给它添加⼀个随时间变化的属性,用于存储汽车的行驶里程。

2.2 给属性指定默认值

有些属性无须通过形参来定义,可以在 init() 方法中为其指定默认值。
下面来添加⼀个名为 odometer_reading(里程表)的属性,其初始值总是为 0。还添加了⼀个名为 read_odometer() 的方法,用于读取汽车的里程表:

class Car:"""⼀次模拟汽⻋的简单尝试"""def __init__(self, make, model, year):"""初始化描述汽⻋的属性"""self.make = make   #产商self.model = model #型号self.year = year   #出厂年份self.odometer_reading = 0 #里程表默认为0     新增加的def get_descriptive_name(self):"""返回格式规范的描述性信息"""long_name = f"{self.year} {self.make} {self.model}"return long_namedef read_odometer(self):           #            新增加的"""打印⼀条指出汽⻋⾏驶⾥程的消息"""print(f"这辆车的里程是: {self.odometer_reading} 公里.")my_new_car = Car('奔驰', 'C200', 2024)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()

随着汽车的使用,里程应该要改变.

2.3 修改属性的值

可以用三种不同的方式修改属性的值:直接通过实例修改,通过方法设置 ,以及通过方法递增 (增加特定的值) 。下面依次介绍这些方式。

2.3.1 直接修改属性的值

要修改属性的值,最简单的方式是通过实例直接访问它。下面的代码直接将里程表读数设置为 23:

my_new_car = Car('奔驰', 'C200', 2024)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23 #直接修改属性的值
my_new_car.read_odometer()

2.3.2 通过方法修改属性的值

添加一个修改属性的方法将非常有用。这样就无须直接访问属性了,而是可将值传递给方法,由它在内部进行更新。
下面的增加⼀个名为 update_odometer() 的方法:

class Car:"""⼀次模拟汽⻋的简单尝试"""def __init__(self, make, model, year):"""初始化描述汽⻋的属性"""self.make = make   #产商self.model = model #型号self.year = year   #出厂年份self.odometer_reading = 0 #里程表默认为0def get_descriptive_name(self):"""返回格式规范的描述性信息"""long_name = f"{self.year} {self.make} {self.model}"return long_namedef read_odometer(self):"""打印⼀条指出汽⻋⾏驶⾥程的消息"""print(f"这辆车的里程是: {self.odometer_reading} 公里.")def update_odometer(self, mileage):  #新增一个方法"""将⾥程表读数设置为指定的值"""self.odometer_reading = mileagemy_new_car = Car('奔驰', 'C200', 2024)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(100)  #通过方法将里程改为100
my_new_car.read_odometer()

还可以对 update_odometer() 方法进行扩展,使其在修改里程表读数时做些额外的工作。
下面来添加⼀些逻辑,禁止将里程表读数往回调:

class Car:"""⼀次模拟汽⻋的简单尝试"""
#类其它地方省略def update_odometer(self, mileage):"""将⾥程表读数设置为指定的值禁⽌将⾥程表读数往回调"""if mileage >= self.odometer_reading:self.odometer_reading = mileageelse:print("你不能把里程往回调!")my_new_car = Car('奔驰', 'C200', 2024)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(100)  #通过方法将里程改为100
my_new_car.read_odometer()
my_new_car.update_odometer(50)  #把里程改小

现在,update_odometer() 会在修改属性前检查指定的读数是否合理。如果给 mileage 指定的值大于或等于原来的行驶里程(self.odometer_reading),就将里程表读数改为新指定的行驶里程;否则发出警告,指出不能将里程表往回调。

2.3.3 通过方法让属性的值递增

有时候需要将属性值增加一定的数量,而不是将其设置为全新的值。
下面在Car中添加一个新方法

class Car:"""⼀次模拟汽⻋的简单尝试"""def __init__(self, make, model, year):"""初始化描述汽⻋的属性"""self.make = make   #产商self.model = model #型号self.year = year   #出厂年份self.odometer_reading = 0 #里程表默认为0def get_descriptive_name(self):"""返回格式规范的描述性信息"""long_name = f"{self.year} {self.make} {self.model}"return long_namedef read_odometer(self):"""打印⼀条指出汽⻋⾏驶⾥程的消息"""print(f"这辆车的里程是: {self.odometer_reading} 公里.")def update_odometer(self, mileage):"""将⾥程表读数设置为指定的值禁⽌将⾥程表读数往回调"""if mileage >= self.odometer_reading:self.odometer_reading = mileageelse:print("你不能把里程往回调!")def increment_odometer(self, miles):  # 新增加的方法"""让⾥程表增加指定的量"""self.odometer_reading += milesmy_new_car = Car('奔驰', 'C200', 2024)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(100)  #通过方法将里程改为100
my_new_car.read_odometer()my_new_car.increment_odometer(50)  #增加50公里
my_new_car.read_odometer()

3.继承

在编写类时,并非总是要从头开始。如果要编写的类是⼀个既有的类的特殊版本,可使用继承(inheritance)。当⼀个类继承另⼀个类时,将自动获得后者的所有属性和方法。原有的类称为父类(parent class),而新类称为
子类(child class)。子类不仅继承了父类的所有属性和方法,还可定义自己的属性和方法。

3.1 子类的 init() 方法

在既有的类的基础上编写新类,通常要调用父类的 init() 方法。这将初始化在父类的 init() 方法中定义的所有属性,从而让子类也可以使用这些属性。
下面来模拟电动汽车。电动汽车是⼀种特殊的汽车,因此可在之前Car 类的基础上创建新类 ElectricCar。这样,只需为电动汽车特有的属性和行为编写代码即可。


class Car:"""⼀次模拟汽⻋的简单尝试"""def __init__(self, make, model, year):"""初始化描述汽⻋的属性"""self.make = make  # 产商self.model = model  #型号self.year = year  #出厂年份self.odometer_reading = 0  #里程表默认为0def get_descriptive_name(self):"""返回格式规范的描述性名称"""long_name = f"{self.year} {self.make} {self.model}"return long_namedef read_odometer(self):"""打印⼀个句⼦,指出汽⻋的⾏驶⾥程"""print(f"这辆车的里程是: {self.odometer_reading} 公里.")def update_odometer(self, mileage):"""将⾥程表读数设置为给定的值"""if mileage >= self.odometer_reading:self.odometer_reading = mileageelse:print("你不能把里程往回调!")def increment_odometer(self, miles):"""让⾥程表读数增加给定的量"""self.odometer_reading += milesclass ElectricCar(Car): """电动汽⻋的独特之处""" def __init__(self, make, model, year): """初始化⽗类的属性""" super().__init__(make, model, year) my_leaf = ElectricCar('小米', 'su7', 2024) 
print(my_leaf.get_descriptive_name()) 

在定义子类时,必须在括号内指定父类的名称。init() 方法接受创建 Car实例所需的信息 ,super() 是⼀个特殊的函数,让你能够调用父类的方法(如第35行代码)。

父类也称为超类(superclass),函数名super 由此得名。

3.2 给子类定义属性和方法

让⼀个类继承另⼀个类后,就可以添加区分子类和父类所需的新属性和新方法了。
为电动车特有的属性(电池),以及⼀个描述该属性的方法。编写⼀个方法打印对电池的描述:


class Car:"""⼀次模拟汽⻋的简单尝试"""def __init__(self, make, model, year):"""初始化描述汽⻋的属性"""self.make = make  # 产商self.model = model  #型号self.year = year  #出厂年份self.odometer_reading = 0  #里程表默认为0def get_descriptive_name(self):"""返回格式规范的描述性名称"""long_name = f"{self.year} {self.make} {self.model}"return long_namedef read_odometer(self):"""打印⼀个句⼦,指出汽⻋的⾏驶⾥程"""print(f"这辆车的里程是: {self.odometer_reading} 公里.")def update_odometer(self, mileage):"""将⾥程表读数设置为给定的值"""if mileage >= self.odometer_reading:self.odometer_reading = mileageelse:print("你不能把里程往回调!")def increment_odometer(self, miles):"""让⾥程表读数增加给定的量"""self.odometer_reading += milesclass ElectricCar(Car):"""电动汽⻋的独特之处"""def __init__(self, make, model, year,batt_size):"""先初始化⽗类的属性,再初始化电动汽⻋特有的属性"""super().__init__(make, model, year)self.battery_size = batt_size  #新增电池的大小def describe_battery(self):  #新增的方法"""打印⼀条描述电池容量的消息"""print(f"这辆车的电池是: {self.battery_size}度.")my_leaf = ElectricCar('小米', 'su7', 2024,101)
print(my_leaf.get_descriptive_name())
my_leaf.describe_battery()

第36行添加新属性self.battery_size。根据 ElectricCar 类创建的所有实例都将包含这个属性,但所有的 Car 实例都不包含它。第38行,新增 describe_battery() 的方法 。
在子类中可以添加任意数量的属性和方法。如果⼀个属性或方法是所有汽车都有的,而不是电动汽车特有的,就应将其加入Car 类而不是ElectricCar 类。这样,使用 Car 类的成员将获得相应的功能,而ElectricCar 类只包含处理电动汽车特有属性和行为的代码。

3.3 子类中重写父类中的方法

如果父类中的⼀些方法不能满足子类的需求,就可以重写:
在子类中定义⼀个与要重写的父类方法同名的方法。
这样,Python 将忽略这个父类方法,只关注你在子类中定义的相应方法。
例如,在ElectricCar类中重写get_descriptive_name方法

class Car:"""⼀次模拟汽⻋的简单尝试"""def __init__(self, make, model, year):"""初始化描述汽⻋的属性"""self.make = make  # 产商self.model = model  #型号self.year = year  #出厂年份self.odometer_reading = 0  #里程表默认为0def get_descriptive_name(self):"""返回格式规范的描述性名称"""long_name = f"{self.year} {self.make} {self.model}"return long_namedef read_odometer(self):"""打印⼀个句⼦,指出汽⻋的⾏驶⾥程"""print(f"这辆车的里程是: {self.odometer_reading} 公里.")def update_odometer(self, mileage):"""将⾥程表读数设置为给定的值"""if mileage >= self.odometer_reading:self.odometer_reading = mileageelse:print("你不能把里程往回调!")def increment_odometer(self, miles):"""让⾥程表读数增加给定的量"""self.odometer_reading += milesclass ElectricCar(Car):"""电动汽⻋的独特之处"""def __init__(self, make, model, year,batt_size):"""先初始化⽗类的属性,再初始化电动汽⻋特有的属性"""super().__init__(make, model, year)self.battery_size = batt_size  #电池的大小def describe_battery(self):"""打印⼀条描述电池容量的消息"""print(f"这辆车的电池是: {self.battery_size}度.")def get_descriptive_name(self):"""返回格式规范的描述性名称"""long_name = f"{self.year} {self.make} {self.model} 电池:{self.battery_size}度"return long_namemy_leaf = ElectricCar('小米', 'su7', 2024,101)
print(my_leaf.get_descriptive_name())

4.组合

如果一个类的实例是另一个类的属性,我们称为组合
例如,实现一个电池 (Battery) 类,并将⼀个 Battery 实例作为 ElectricCar 类的属性

class Car:"""⼀次模拟汽⻋的简单尝试"""def __init__(self, make, model, year):"""初始化描述汽⻋的属性"""self.make = make  # 产商self.model = model  #型号self.year = year  #出厂年份self.odometer_reading = 0  #里程表默认为0def get_descriptive_name(self):"""返回格式规范的描述性名称"""long_name = f"{self.year} {self.make} {self.model}"return long_namedef read_odometer(self):"""打印⼀个句⼦,指出汽⻋的⾏驶⾥程"""print(f"这辆车的里程是: {self.odometer_reading} 公里.")def update_odometer(self, mileage):"""将⾥程表读数设置为给定的值"""if mileage >= self.odometer_reading:self.odometer_reading = mileageelse:print("你不能把里程往回调!")def increment_odometer(self, miles):"""让⾥程表读数增加给定的量"""self.odometer_reading += miles
class Battery:"""电池类"""def __init__(self, make="宁德时代", batt_size=101):"""初始化电池的属性"""self.make = make  # 电池产商self.battery_size = batt_sizedef describe_battery(self):"""输出电池容量的信息"""print(f"电池厂家:{self.make},容量:{self.battery_size}度")
class ElectricCar(Car):"""电动汽⻋的独特之处"""def __init__(self, make, model, year):"""先初始化⽗类的属性,再初始化电动汽⻋特有的属性"""super().__init__(make, model, year) #初始化父类self.battery = Battery()   #初始化子类属性def get_descriptive_name(self):"""自身的描述"""long_name = f"{self.year} {self.make} {self.model} 电池厂家:{self.battery.make},容量:{self.battery.battery_size}度"return long_name my_leaf = ElectricCar('小米', 'su7', 2024) 
print(my_leaf.get_descriptive_name()) 

5.导入类

随着程序编写的不断进行,程序文件可能变得很大,程序结构变得复杂,Python的理念"希望你的文件尽量简洁",它允许你把类存放在单独的模块(文件)中,然后在使用时导入模块即可。

5.1 导入单个类

在"my_car.py"文件中


class Car:"""自定义的汽车类"""def show(self):print("我是一辆汽车")

在"第9章类.py"文件中

from my_car import Car  #导入汽车类
c = Car()
c.show()

通过将这个类移到⼀个模块中并导入该模块,依然可使用其所有功能,但主程序文件变得整洁易读了。

5.2 导入多个类

下面演示,如何从一个文件中导入多个类。
在"test.py"文件中

class A:def show(self):print("我是A类")class B:def show(self):print("我是B类")

在"第9章类.py"文件中

from test import A,B #引用A类,B类
a = A()
b = B()
a.show()
b.show()

6.Python标准库

Python 标准库是⼀组模块,在安装 Python 时已经包含在内。 你可以使用标准库中的任何函数和类,只需在程序开头添加⼀条简单的 import 语句即可。
例如,需要使用随机数函数.

from random import randint  #引入随机数函数
print(randint(0, 10))       #输出0~10之间的一个随机数

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

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

相关文章

C语言 | Leetcode C语言题解之第436题寻找右区间

题目: 题解: typedef struct {int start;int index; } Node;int cmp(const void *pa, const void *pb) {return ((Node *)pa)->start - ((Node *)pb)->start; }int* findRightInterval(int** intervals, int intervalsSize, int* intervalsColSiz…

四川财谷通信息技术有限公司抖音小店强势引领电商

在数字经济蓬勃发展的今天,短视频与直播电商已成为推动消费增长的重要引擎,而抖音平台更是以其庞大的用户基础、精准的算法推荐和创新的商业模式,成为了众多商家争相入驻的蓝海市场。在这片充满活力的电商沃土上,四川财谷通信息技…

GPS冷启动定位不准问题

1.使用模块 EG800K 2.定位不准问题 应用场景:由于低功耗设备,需要GPS定位,设备的功耗会很高,因此每次定位完成后必须将模块的电源断开。 定位不准原因: 1.每次设备从供电,到定位成功,需要3…

【文心智能体】 旅游手绘手帐 开发分享 零代码 手绘风景 记录行程和心情 旅游攻略

旅游手绘手帐,点击文心智能体平台AgentBuilder | 想象即现实 目录 背景 创作灵感 开发历程 一、基础配置 二、高级配置 三、引导示例(提示词) 四、prompt(提示词)优化 期待优化 背景 这个智能体是一个零代码…

CSS中的字体样式、文本样式、列表样式以及背景和渐变

一、字体样式和文本样式 1.span标签 span标签的作用&#xff1a;能让某几个文字或者是词语凸显出来 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-…

在深度学习中,是否应该打破正负样本1:1的迷信思想?

Q&#xff1a;是否应该打破正负样本 1:1 的迷信思想&#xff1f;A&#xff1a;是的&#xff0c;类别不平衡的比例只是表象&#xff0c;并非本质。 Q&#xff1a;当训练集和测试集分布匹配&#xff0c;但正负样本比例仍然悬殊&#xff0c;是否有必要再引入处理不平衡样本的策略…

新峰商城之订单处理流程

订单处理是电商系统中的重要模块&#xff0c;从用户单击提交订单并成功生成订单开始&#xff0c;包括订单支付成功、订单信息确认、订单出库、到确认收货的正常订单流程。也包括了订单取消、订单退款等其它异常流程。 一、订单处理流程 正常流程&#xff1a; 订单生成后&…

Git - 初识版本库

版本库也叫仓库&#xff0c;英文名 repository。 ‍ 创建版本库 之前我们说了版本库的概念&#xff1a; 存储版本的地方&#xff08;存放各个版本之间差异的地方&#xff09;&#xff0c;通常称为版本库。通常版本库是以文件&#xff08;夹&#xff09;的形式存放在磁盘上&a…

处理RabbitMQ连接和认证问题

在使用RabbitMQ进行消息队列管理时&#xff0c;我们可能会遇到各种连接和认证问题。本文将介绍如何诊断和解决这些问题&#xff0c;并通过使用RabbitMQ的管理端进行登录验证来确保配置正确。 1. 问题概述 在最近的一次部署中&#xff0c;我们遇到了两个主要问题&#xff1a; …

成为谷歌开发者专家(GDE)的经历

大家好&#xff0c;我是张海龙(Jason)。经过一年多的准备&#xff0c;GDE申请 终于正式成功通过面试&#xff0c;成为了国内第一位Firebase GDE。下面对整个过程做个总结&#xff0c;希望对大家有所帮助。 1.什么是 GDE&#xff1f; Google Developers上面有详细的说明&#x…

Apache Druid命令执行(CVE-2021-25646)

漏洞详情&#xff1a; Apache Druid 是用Java编写的面向列的开源分布式数据存储系统&#xff0c;旨在快速获取大量事件数据&#xff0c;并在数据之上提供低延迟查询。 Apache Druid含有能够执行嵌入在各种类型请求中由用户提供的JavaScript代码功能。此功能适用于高度信任环境…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-21

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-21 1. AIvril: AI-Driven RTL Generation With Verification In-The-Loop Authors: Mubashir ul Islam, Humza Sami, Pierre-Emmanuel Gaillardon, and Valerio Tenace AIVRIL: 人工智能驱动的RTL生成与验证内…

如何在Excel中快速找出前 N 名,后 N 名

有如下销售额统计表&#xff1a; 找出销售额排前 10 名的产品及其销售额&#xff0c;和销售额排倒数 10 名以内的产品及其销售额&#xff0c;结果如下所示&#xff1a; 前 10 名&#xff1a; spl("E(?1).sort(ProductSales:-1).to(10)",A1:C78)后 10 名&#xff1…

K8S精进之路-控制器StatefulSet有状态控制 -(2)

状态说明 在进行StatefulSet部署之前&#xff0c;我们首先可能要了解一下&#xff0c;什么是"有状态应用"和"无状态应用"。无状态应用就是pod无论部署在哪里&#xff0c;在哪台服务器上提供服务&#xff0c;都是一样的结果&#xff0c;比如经常用的nginx。…

Debian与Ubuntu:深入解读两大Linux发行版的历史与联系

Debian与Ubuntu&#xff1a;深入解读两大Linux发行版的历史与联系 引言 在开源操作系统的领域中&#xff0c;Debian和Ubuntu是两款备受瞩目的Linux发行版。它们不仅在技术上有着密切的联系&#xff0c;而且各自的发展历程和理念也对开源社区产生了深远的影响。本文将详细介绍…

主数据的前世今生与治理方法论(附PPT | 某集团公司主数据项目案例与方法论)

主数据&#xff08;Master Data&#xff09;是指企业内核心业务实体数据&#xff0c;具有共享、稳定、跨部门和系统的特点。主数据在企业数据管理中扮演着至关重要的角色&#xff0c;它是企业核心业务实体数据的核心组成部分。它是企业经营运作的主体对象&#xff0c;也是企业数…

HTTP中的event-stream,eventsource,SSE,chatgpt,stream request,golang

我们都知道chatgpt是生成式的&#xff0c;因此它返回给客户端的消息也是一段一段的&#xff0c;所以普通的HTTP协议无法满足&#xff0c;当然websocket是能满足的&#xff0c;但是这个是双向的通信&#xff0c;其实 SSE&#xff08;Server-Sent Events&#xff09; 正好满足这个…

[数据集][目标检测]手机识别检测数据集VOC+YOLO格式9997张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;9997 标注数量(xml文件个数)&#xff1a;9997 标注数量(txt文件个数)&#xff1a;9997 标注…

用Python提取PowerPoint演示文稿中的音频和视频

将多种格式的媒体内容进行重新利用&#xff08;如PowerPoint演示中的音频和视频&#xff09;是非常有价值的。无论是创建独立的音频文件、提取视频以便在线分发&#xff0c;还是为了未来的使用需求进行资料归档&#xff0c;从演示文稿中提取这些媒体文件可以为多媒体内容的多次…

Remotion:使用前端技术开发视频

前言 最近做文章突然想到很多文章其实也可以用视频的方式来展现&#xff0c;以现在短视频的火爆程度&#xff0c;肯定能让更多的人看到。 恰巧最近看了很多关于动画的前端 js 库&#xff0c;那如果将这些动画帧连续起来&#xff0c;岂不是就成了一个视频吗&#xff1f; 而且…