Python 面向对象的三大特征
前言:本篇讲解面向对象的三大特征(封装,继承,多态),还有比较细致的(类属性类方法,静态方法),分步骤讲解,比较适合理清楚三大特征的思路

面向对象的的三大特征:
封装------根据职责将属性和方法封装到一个抽象的类中 ; 增强代码的安全性
继承------实现代码的重用,相同的代码不需要重复的编写 ; 增强代码的可重用性
多态------不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度 。 增强代码的可扩展性
封装
1.1 概念:
封装是将数据(属性)和操作数据的方法(行为)捆绑在一起,形成一个独立的单元,即对象。同时,对外部隐藏对象的内部实现细节,只提供公开的接口供外部访问和操作,以此增强数据的安全性和程序的可维护性。
把现实世界中的主体中的属性和方法书写到类的里面的操作即为封装封装可以为属性和方法添加为私有权限,不能直接被外部访问
1.2 封装中的私有属性和私有方法:
在面向对象代码中,我们可以把属性和方法分为两大类:公有(属性、方法)、私有(属性、方法)Python:公有(属性、方法),私有(属性、方法)Java:公有(属性、方法),受保护(属性、方法),私有(属性、方法)公有属性和公有方法:无论在类的内部还是在类的外部我们都可以对属性和方法进行操作。但是有些情况下,我们不希望在类的外部对类内部的属性和方法进行操作。我们就可以把这个属性或方法封装成私有形式。
1.3 定义方式:
在 Python 里,通过命名约定来实现访问控制。以单下划线
_开头的属性和方法被视为受保护的,虽外部仍可访问,但开发者通常将其作为内部使用的标识;以双下划线__开头的属性和方法被视为私有的,外部不能直接访问。
class BankAccount:def __init__(self, balance):# 私有属性self.__balance = balancedef deposit(self, amount):self.__balance += amountreturn self.__balancedef withdraw(self, amount):if amount <= self.__balance:self.__balance -= amountreturn self.__balanceelse:return "余额不足"def get_balance(self):return self.__balanceaccount = BankAccount(1000)
# 不能直接访问私有属性
# print(account.__balance) 会报错
print(account.get_balance())
当然私有属性不能在类的外部被直接访问,我们也有方法。
1.4 私有属性设置与访问"接口"
读取私有属性的接口(Getter 方法)
为了让外部代码能够安全地获取私有属性的值,可以在类中定义一个公共的方法,通常称为 Getter 方法。
class Person:def __init__(self, name, age):self.__name = nameself.__age = age# Getter 方法,用于获取私有属性 __name 的值def get_name(self):return self.__name# Getter 方法,用于获取私有属性 __age 的值def get_age(self):return self.__agep = Person("Alice", 25)
print(p.get_name()) # 输出: Alice
print(p.get_age()) # 输出: 25
修改私有属性的接口(Setter 方法)
如果需要允许外部代码修改私有属性的值,可以在类中定义一个公共的方法,通常称为 Setter 方法。在 Setter 方法中,可以添加一些验证逻辑,确保修改的值是合法的。
class Person:def __init__(self, name, age):self.__name = nameself.__age = age@propertydef name(self):return self.__name@name.setterdef name(self, new_name):if isinstance(new_name, str):self.__name = new_nameelse:print("名称必须是字符串类型")@propertydef age(self):return self.__age@age.setterdef age(self, new_age):if isinstance(new_age, int) and new_age >= 0:self.__age = new_ageelse:print("年龄必须是一个非负整数")p = Person("Alice", 25)
print(p.name) # 输出: Alice
p.name = "Bob"
print(p.name) # 输出: Bob
总结:在Python中,一般定义函数名' get_xx '用来获取私有属性,定义' set_xx '用来修改私有属性值。
继承
2.1 概念:
继承是指一个类(子类、派生类)可以继承另一个类(父类、基类)的属性和方法。子类能够复用父类的代码,还可添加新属性和方法,或者修改父类的方法以实现不同行为。
2.2 作用:
代码复用:避免重复编写相同代码,提高开发效率。例如多个类有共同属性和方法,可将这些提取到父类,子类直接继承使用。
功能扩展:子类在继承父类基础上,能添加新属性和方法,满足不同需求。
建立类的层次结构:有助于组织和管理代码,体现类之间的关系。
2.3 基本语法:
class B(object):pass
class A(B):pass
a = A()
a.B中的所有公共属性
a.B中的所有公共⽅法
2.4 单继承:
一个子类只继承一个父类。不能同时继承多个类。这个类会有具有父类的属性和方法。这是最常见的继承方式,结构清晰,易于理解和维护。
基本语法:
# 1、定义⼀个共性类(⻋类)
class Car(object):def run(self):print('i can run')
# 2、定义汽油⻋
class GasolineCar(Car):pass
# 3、定义电动⻋
class EletricCar(Car):pass
bwm = GasolineCar()
bwm.run()
单继承的传递性:
单继承的传递性可以描述为:如果类
C继承自类B,而类B又继承自类A,那么类C不仅会继承类B中定义的属性和方法,还会继承类A中定义的属性和方法。这种传递性可以一直延续下去,无论继承层次有多深,子类都能获取到其所有祖先类的非私有属性和方法。
class C(object):def func(self):print('我是C类中的相关⽅法func')
class B(C):def funb(self):print('我是B类中的相关⽅法funb')
class A(B):def funA(self):print('我是A类中的相关⽅法funa')a = A()
a.funa()
b = B()
b.funb()
c = C()
c.func() 2.5 object:
在 Python 中,
object是所有类的基类,在 Python 面向对象编程体系里扮演着非常基础且重要的角色,所有类默认都会隐式继承自object类。也就是说,即使你定义类时没有显式指定基类,它实际上也是object类的子类。
# 定义一个没有显式指定基类的类
class MyClass:pass# 检查 MyClass 是否是 object 的子类
print(issubclass(MyClass, object)) # 输出: True 2.6 多继承:
多继承是指一个子类可以同时继承多个父类的特性。也就是说,子类可以拥有多个父类所定义的属性和方法,从而可以复用多个不同父类的代码。

# 定义第一个父类
class Parent1:def method1(self):print("This is method1 from Parent1")# 定义第二个父类
class Parent2:def method2(self):print("This is method2 from Parent2")# 定义子类,继承自 Parent1 和 Parent2
class Child(Parent1, Parent2):pass# 创建子类的实例
child = Child()# 调用从 Parent1 继承的方法
child.method1()# 调用从 Parent2 继承的方法
child.method2() 2.7 重写:
子类重写父类中的属性与方法,子类可以重写父类的方法,即子类定义一个与父类同名的方法,这样在调用该方法时,会优先使用子类的方法。
基本语法:
class Father(object):属性⽅法
class Son(Father):⽗类属性和⽅法⾃⼰的属性和⽅法(如果⼦类中的属性和⽅法与⽗类中的属性或⽅法同名,则⼦类中的属性或⽅法会对⽗类中同名的属性或⽅法进⾏覆盖(重写)) 示例代码:
class Animal(object):def eat(self):print('i can eat')# 公共⽅法def call(self):print('i can call')
class Dog(Animal):# 重写⽗类的call⽅法def call(self):print('i can 汪汪汪')
class Cat(Animal):# 重写⽗类的call⽅法def call(self):print('i can 喵喵喵')
wangcai = Dog()
wangcai.eat()
wangcai.call()
miaomiao = Cat()
miaomiao.eat()
miaomiao.call() 2.8 super:
在 Python 面向对象编程的继承机制里,
super()是一个非常实用的内置函数,它主要用于调用父类(超类)的方法。super()函数返回一个代理对象,该对象会将方法调用委托给父类或兄弟类,从而可以方便地调用父类的方法。
调用父类的构造方法
在子类的构造方法中,经常需要调用父类的构造方法来初始化从父类继承的属性。
class Animal:def __init__(self, name):self.name = nameprint(f"Animal 的构造方法被调用,名字是 {self.name}")class Dog(Animal):def __init__(self, name, breed):# 调用父类的构造方法super().__init__(name)self.breed = breedprint(f"Dog 的构造方法被调用,品种是 {self.breed}")# 创建 Dog 类的实例
dog = Dog("旺财", "金毛寻回犬") 在上述代码中,Dog 类继承自 Animal 类。在 Dog 类的构造方法 __init__ 中,使用 super().__init__(name) 调用了父类 Animal 的构造方法,先完成父类属性的初始化,再初始化子类特有的属性。
调用父类的其他方法
除了构造方法,super() 还可以用于调用父类的其他普通方法。当子类重写了父类的某个方法,但又需要在子类方法中使用父类方法的功能时,就可以使用 super() 来调用父类的方法。
class Animal:def speak(self):return "动物发出声音"class Dog(Animal):def speak(self):# 调用父类的 speak 方法parent_speak = super().speak()return f"{parent_speak},具体来说是汪汪叫"# 创建 Dog 类的实例
dog = Dog()
print(dog.speak()) super() 函数的工作原理与 Python 的方法解析顺序(Method Resolution Order,MRO)有关。MRO 定义了在多继承情况下,Python 查找方法的顺序。super() 会根据 MRO 来确定要调用的父类方法。可以通过类的 __mro__ 属性查看类的 MRO。
2.9 方法解析顺序(MRO)
当多个父类中存在同名方法时,Python 需要确定调用哪个父类的方法,这就涉及到方法解析顺序(Method Resolution Order,MRO)。可以通过类的
__mro__属性查看方法解析顺序。
class A:def method(self):print("Method from A")class B(A):def method(self):print("Method from B")class C(A):def method(self):print("Method from C")class D(B, C):pass# 查看 D 类的方法解析顺序
print(D.__mro__)# 创建 D 类的实例
d = D()
# 调用 method 方法
d.method() 在上述代码中,D 类继承自 B 和 C,而 B 和 C 又都继承自 A。D.__mro__ 会输出一个元组,显示方法解析的顺序。当调用 d.method() 时,Python 会按照 MRO 的顺序查找 method 方法,找到后就会调用该方法。
多态
3.1 概念:
3.2 基本语法:
'''
⾸先定义⼀个⽗类,其可能拥有多个⼦类对象。当我们调⽤⼀个公共⽅法(接⼝)时,传递的对象不
同,则返回的结果不同。
'''
class Fruit(object): # ⽗类Fruitdef makejuice(self):print('i can make juice')
class Apple(Fruit): # ⼦类:苹果# 重写⽗类⽅法def makejuice(self):print('i can make apple juice')
class Banana(Fruit): # ⼦类:⾹蕉# 重写⽗类⽅法def makejuice(self):print('i can make banana juice')
class Orange(Fruit): # ⼦类:橘⼦# 重写⽗类⽅法def makejuice(self):print('i can make orange juice')
# 定义⼀个公共接⼝(专⻔⽤于实现榨汁操作)
def service(obj):# obj要求是⼀个实例化对象,可以传⼊苹果对象/⾹蕉对象obj.makejuice()
# 调⽤公共⽅法
service(Orange()) 如果加号的两边都是数值类型的数据,则加号代表运算符如果加号的两边传入的是字符串类型的数据,则加号代表合并操作,返回合并后的字符串'a' + 'b' = 'ab'如果加号的两边出入序列类型的数据,则加号代表合并操作,返回合并后的序列[1, 2, 3] + [4, 5, 6] = [1, 2, 3, 4, 5, 6]
类属性
类属性是一种重要的概念,它与实例属性共同构成了类的数据部分。类属性是属于类本身的属性,它被该类的所有实例对象所共享。类属性在类定义中直接声明,不依赖于某个具体的实例对象。
4.1 特点:
- 共享性:所有由该类创建的实例对象都可以访问类属性,类属性只有一份拷贝,存储在类的命名空间中。
- 独立性:类属性独立于实例属性,即使没有创建任何实例对象,类属性依然存在于类中。
4.2 基本语法:
class Car:# 定义类属性wheels = 4def __init__(self, brand):self.brand = brand# 通过类名访问类属性
print(Car.wheels) # 输出: 4# 创建类的实例
my_car = Car("宝马")
# 通过实例对象访问类属性
print(my_car.wheels) # 输出: 4 在上述代码中,wheels 是 Car 类的类属性,既可以通过类名 Car 直接访问,也可以通过类的实例对象 my_car 进行访问。
4.3 修改类属性
类属性可以通过类名进行修改,修改后所有实例对象访问该类属性时都会得到新的值。
class Car:wheels = 4def __init__(self, brand):self.brand = brand# 修改类属性
Car.wheels = 6# 创建类的实例
my_car = Car("宝马")
# 通过实例对象访问修改后的类属性
print(my_car.wheels) # 输出: 6 需要注意的是,如果通过实例对象去修改类属性,实际上会为该实例创建一个同名的实例属性,而不会影响类属性本身。
4.4 类属性与实例属性的对比:
- 存储位置:类属性存储在类的命名空间中,而实例属性存储在每个实例对象的命名空间中。
- 访问方式:类属性可以通过类名和实例对象访问,实例属性只能通过实例对象访问。
- 数据共享性:类属性被所有实例对象共享,一个实例对类属性的修改会影响其他实例;实例属性是每个实例独有的,修改一个实例的属性不会影响其他实例。
4.5 综上所述
类属性是类定义中声明的属性,被所有实例共享。可通过类或实例访问修改,用于存储类级别的数据和状态。
类方法
类方法是绑定到类而不是实例的方法。在 Python 中,使用
@classmethod装饰器来定义类方法。类方法的第一个参数通常命名为cls,它代表类本身,通过cls可以访问和操作类的属性和调用类的其他方法。
5.1 基本语法
class MyClass:class_attribute = "这是类属性"@classmethoddef class_method(cls):return cls.class_attribute# 调用类方法
result = MyClass.class_method()
print(result) # 输出: 这是类属性 5.2 访问和修改类属性
类方法可以直接访问和修改类属性,因为它的第一个参数 cls 代表类本身。
class Student:total_students = 0def __init__(self, name):self.name = nameStudent.total_students += 1@classmethoddef get_total_students(cls):return cls.total_students# 创建 Student 类的实例
s1 = Student("Alice")
s2 = Student("Bob")# 调用类方法获取学生总数
total = Student.get_total_students()
print(total) # 输出: 2 在上述代码中,get_total_students 是一个类方法,通过 cls.total_students 访问了类属性 total_students。
5.3 调用方式
类方法可以通过类名直接调用,也可以通过实例对象调用,但推荐使用类名调用,因为类方法的主要作用是操作类本身。
class MyClass:@classmethoddef class_method(cls):print("这是类方法")# 通过类名调用
MyClass.class_method()
# 通过实例调用
obj = MyClass()
obj.class_method() 5.4 与实例方法和静态方法的对比
与实例方法对比
- 参数不同:实例方法的第一个参数是
self,代表实例对象本身,通过self可以访问和操作实例属性;类方法的第一个参数是cls,代表类本身,通过cls可以访问和操作类属性。 - 调用方式不同:实例方法必须通过实例对象调用;类方法可以通过类名或实例对象调用。
- 用途不同:实例方法主要用于操作实例对象的属性和实现实例对象的行为;类方法主要用于操作类属性和创建工厂方法等与类本身相关的操作。
与静态方法对比
- 参数不同:静态方法没有特殊的第一个参数,它不与类或实例有直接的绑定关系;类方法有第一个参数
cls,代表类本身。 - 功能用途不同:静态方法通常用于执行一些与类和实例的状态无关的通用操作,例如数学计算、字符串处理等;类方法主要用于操作类属性、创建工厂方法等与类本身相关的操作。
5.5 综上所述
不需要创建类的对象,通过 类名. 的⽅式就可以访问类的属性或者调用类的方法 。
用@classmethod 修饰的方法为类方法;
类方法的参数为 cls,在类方法内部通过 cls.类属性 或者 cls.类方法 来访问同一个类中的其他类属性和类方法;
类方法不需要实例化就可以调用,类方法只能访问同一个类中的类属性和类方法
静态方法
静态方法是属于类的方法,但它既不依赖于类本身(即类属性和类方法),也不依赖于类的实例对象(即实例属性和实例方法)。在 Python 中,使用
@staticmethod装饰器来定义静态方法,静态方法没有类似self(代表实例对象)或cls(代表类本身)这样的特殊第一个参数。既不需要访问实例属性或者调用实例方法也不需要访问类属性或者调用类方法这个时候,可以把这个方法封装成一个静态方法
6.1 基本语法
# 开发⼀款游戏
class Game(object):# 开始游戏,打印游戏功能菜单@staticmethod # 修饰符,声明为静态⽅法,⽆需传递self参数,直接使⽤类名即可,⽆需实例化对象def menu(): # 静态⽅法print('1、开始游戏')print('2、游戏暂停')print('3、退出游戏')
# 开始游戏、打印菜单
Game.menu() # 调⽤静态⽅法,⽆需实例化对象,直接使⽤类名即可 6.2 特点
- 独立性:静态方法不与类或实例的状态相关联,它不访问类属性、类方法,也不访问实例属性、实例方法。可以把它看作是一个定义在类内部的普通函数,只是为了代码组织的需要而放在类中。
- 调用灵活性:既可以通过类名直接调用,也可以通过类的实例对象调用。
6.3 综上所述
类里面的普通成员方法需要对象进行调用,不能直接使用类名调用。
用@staticmethod 修饰的方法为静态方法;
静态方法是独立存在的,不能访问类或者实例的任何属性和方法;
通过 类名.静态方法 调用静态方法 。

相关文章:
Python 面向对象的三大特征
前言:本篇讲解面向对象的三大特征(封装,继承,多态),还有比较细致的(类属性类方法,静态方法),分步骤讲解,比较适合理清楚三大特征的思路 面向对象的…...
机器学习_18 K均值聚类知识点总结
K均值聚类(K-means Clustering)是一种经典的无监督学习算法,广泛应用于数据分组、模式识别和降维等领域。它通过将数据划分为K个簇,使得簇内相似度高而簇间相似度低。今天,我们就来深入探讨K均值聚类的原理、实现和应用…...
从低清到4K的魔法:FlashVideo突破高分辨率视频生成计算瓶颈(港大港中文字节)
论文链接:https://arxiv.org/pdf/2502.05179 项目链接:https://github.com/FoundationVision/FlashVideo 亮点直击 提出了 FlashVideo,一种将视频生成解耦为两个目标的方法:提示匹配度和视觉质量。通过在两个阶段分别调整模型规模…...
Nuclei 使用手册
Nuclei 是一个开源的快速、高效的漏洞扫描工具,主要用于网络安全领域的漏洞检测。它由 go 语言开发,设计目的是为了高效地扫描 Web 应用程序、网络服务等目标,帮助安全研究人员、渗透测试人员以及红队成员发现潜在的漏洞。 下载链接…...
python学opencv|读取图像(六十七)使用cv2.convexHull()函数实现图像轮廓凸包标注
【1】引言 前序学习进程中,已经初步探索了对图像轮廓的矩形标注和圆形标注: python学opencv|读取图像(六十五)使用cv2.boundingRect()函数实现图像轮廓矩形标注-CSDN博客 但实际上,这两种标注方法都是大致的&#x…...
基于SpringBoot的“高校创新创业课程体系”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“高校创新创业课程体系”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 系统首页界面 个人中心界…...
前端带样式导出excel表格,html表格生成带样式的excel表格
众所周知,前端生成表格通常是用xlsx、excel.js等js库,但这些库想要生成时增加excel样式会很麻烦。 有这么一个js库把html表格连样式带数据一并导出为excel表格: html-table-to-excel npm install html-table-to-excel 使用 html表格: <…...
人形机器人 - 仿生机器人核心技术与大小脑
以下是针对仿生机器人核心技术的结构化总结,涵盖通用核心技术与**“大脑-小脑”专用架构**两大方向: 一、机器人通用核心技术 这些技术是仿生机器人实现功能的基础,与生物体的“身体能力”对应: 1. 感知与交互技术 多模态传感器融合 视觉:3D视觉(如RGB-D相机)、动态目…...
【Linux】【网络】Libevent 内核实现简略版
【Linux】【网络】Libevent 内核实现简略版 1 event_base结构–>相当于Reactor 在使用libevent之前,就必须先创建这个结构。 以epoll为例: 1.1evbase void* evbase-->epollop结构体(以epoll为例) libevent通过一个void…...
大数据学习(49) - Flink按键分区状态(Keyed State)
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
架构——LVS负载均衡主要模式及其原理、服务水平、优缺点
LVS(Linux Virtual Server)是一款高性能的开源负载均衡软件,支持多种负载均衡模式。以下是其主要模式及其原理、服务水平、优缺点: 1. NAT 模式(Network Address Translation) 原理: 请求流程…...
【React组件通讯双重视角】函数式 vs 类式开发指南
目录 前言 正文 父组件向子组件传值 函数式写法 类式写法 子组件向父组件传值 函数式写法 类式写法 兄弟组件通信 函数式写法 类式写法 跨层级通信(使用Context) 函数式写法 类式写法 进阶通讯方式(补充说明…...
VScode内接入deepseek包过程(本地部署版包会)
目录 1. 首先得有vscode软件 2. 在我们的电脑本地已经部署了ollama,我将以qwen作为实验例子 3. 在vscode上的扩展商店下载continue 4. 下载完成后,依次点击添加模型 5. 在这里可以添加,各种各样的模型,选择我们的ollama 6. 选…...
Ubuntu虚拟机NDK编译ffmpeg
目录 一、ffmpeg源码下载1、安装git(用于下载ffmpeg源码)2、创建源码目录,下载ffmpeg源码 二、下载ubuntu对应的NDK,并解压到opt下1、下载并解压2、配置 ~/.bashrc 三、源码编译、1、创建编译脚本2、脚本文件内容3、设置可执行权限并运行4、编译的结果在…...
机器学习:k近邻
所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com),欢迎查看。 K 邻近算法(K-Nearest Neighbors,简称 KNN)是一种经典的机器学习算法,主要用于分类和回归任务…...
js第十二题
题十二:轮播图 要求: 1.鼠标不在图片上方时,进行自动轮播,并且左右箭头不会显示;当鼠标放在图片上方时,停止轮播,并且左右箭头会显示; 2.图片切换之后,图片中下方的小…...
讯飞唤醒+VOSK语音识别+DEEPSEEK大模型+讯飞离线合成实现纯离线大模型智能语音问答。
在信息爆炸的时代,智能语音问答系统正以前所未有的速度融入我们的日常生活。然而,随着数据泄露事件的频发,用户对于隐私保护的需求日益增强。想象一下,一个无需联网、即可响应你所有问题的智能助手——这就是纯离线大模型智能语音…...
Day4 25/2/17 MON
【一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵)】https://www.bilibili.com/video/BV13g41157hK?p4&v…...
HTML【详解】input 标签
input 标签主要用于接收用户的输入,随 type 属性值的不同,变换其具体功能。 通用属性 属性属性值功能name字符串定义输入字段的名称,在表单提交时,服务器通过该名称来获取对应的值disabled布尔值禁用输入框,使其无法被…...
Jvascript网页设计案例:通过js实现一款密码强度检测,适用于等保测评整改
本文目录 前言功能预览样式特点总结:1. 整体视觉风格2. 密码输入框设计3. 强度指示条4. 结果文本与原因说明 功能特点总结:1. 密码强度检测2. 实时反馈机制3. 详细原因说明4. 视觉提示5. 交互体验优化 密码强度检测逻辑Html代码Javascript代码 前言 能满…...
LeetCode刷题---哈希表---290
单词规律 290. 单词规律 - 力扣(LeetCode) 题目: 给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词…...
用React实现一个登录界面
使用React来创建一个简单的登录表单。以下是一个基本的React登录界面示例: 1. 设置React项目 如果你还没有一个React项目,你可以使用Create React App来创建一个。按照之前的步骤安装Create React App,然后创建一个新项目。 2. 创建登录组…...
图论:tarjan 算法求解强连通分量
题目描述 有一个 n n n 个点, m m m 条边的有向图,请求出这个图点数大于 1 1 1 的强连通分量个数。 输入格式 第一行为两个整数 n n n 和 m m m。 第二行至 m 1 m1 m1 行,每一行有两个整数 a a a 和 b b b,表示有一条…...
Haskell语言的物联网
Haskell语言在物联网中的应用 引言 物联网(IoT,Internet of Things)是现代科技发展的重要领域,它将日常生活中的各种设备通过互联网连接起来,实现智能化的控制与管理。随着设备数量的激增,以及数据处理需…...
Java:单例模式(Singleton Pattern)及实现方式
一、单例模式的概念 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来访问该实例,是 Java 中最简单的设计模式之一。该模式常用于需要全局唯一实例的场景,例如日志记录器、配置管理、线程池、数据库…...
Python爬虫实战:股票分时数据抓取与存储 (1)
在金融数据分析中,股票分时数据是投资者和分析师的重要资源。它能够帮助我们了解股票在交易日内的价格波动情况,从而为交易决策提供依据。然而,获取这些数据往往需要借助专业的金融数据平台,其成本较高。幸运的是,通过…...
将图片base64编码后,数据转成图片
将图片数据进行base64编码后,可以在浏览器上查看图片,只需在前端加上data:image/png;base64,即可 在线工具: Base64转图片 - 加菲工具...
天翼云910B部署DeepSeek蒸馏70B LLaMA模型实践总结
一、项目背景与目标 本文记录在天翼云昇腾910B服务器上部署DeepSeek 70B模型的全过程。该模型是基于LLaMA架构的知识蒸馏版本,模型大小约132GB。 1.1 硬件环境 - 服务器配置:天翼云910B服务器 - NPU:8昇腾910B (每卡64GB显存) - 系统内存&…...
Budibase低代码平台体验
低代码平台还是很多的,体验了Nocobase,又开始体验Budibase, 其实Budibase和appsmith更相似一点。 Budibase的安装也很简单。 1.安装好操作系统Debian; 2.安装好docker, docker-compose 3.创建目录/data,在里面参考内容创建文件docker-compos…...
【R语言】GitHub Copilot安装-待解决
参考: 文章目录...
