Python面向对象编程实战:从类定义到高级特性的进阶之旅(2/10)
摘要:本文介绍面向对象编程基础概念,包括类与对象、封装、继承和多态等。以Python语言为例,详细讲述了类的定义与使用、构造函数与析构函数、类的访问控制等。面向对象编程通过将数据和操作封装在一起,提高代码的模块化和可维护性。文章还介绍了类属性与实例属性、类方法与静态方法等高级特性,并通过学生管理系统案例展示面向对象编程在实际项目中的应用。总结指出面向对象编程在软件开发中的重要性和未来发展趋势。
1.面向对象编程基础概念
面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将数据和操作数据的方法封装在一起,以对象为核心来组织和设计程序。在 OOP 中,程序被看作是一系列相互交互的对象集合,每个对象都有自己的状态(属性)和行为(方法)。类(Class)是创建对象的模板,它定义了对象的属性和方法,而对象(Object)是类的具体实例,一个类可以创建多个对象。
以 Python 语言为例,我们来看看类的定义和对象的创建:
# 定义一个简单的类
class Person:def __init__(self, name, age):self.name = nameself.age = agedef introduce(self):print(f"My name is {self.name}, and I am {self.age} years old.")# 创建对象
person1 = Person("Alice", 25)
person2 = Person("Bob", 30)# 调用对象的方法
person1.introduce()
person2.introduce()
在上述代码中,我们定义了一个Person类,其中__init__方法是类的构造函数,用于初始化对象的属性。self代表对象本身,通过self可以访问和操作对象的属性。introduce方法用于打印对象的信息。然后我们创建了person1和person2两个Person类的对象,并调用了它们的introduce方法。
2.类的定义与使用
2.1 类的基本结构
在 Python 中,类是通过class关键字来定义的。类的基本结构包括属性(数据成员)和方法(成员函数)。属性用于存储对象的状态,方法用于定义对象的行为。例如,我们定义一个Car类:
class Car:def __init__(self, brand, color):self.brand = brandself.color = colordef start_engine(self):print(f"{self.color} {self.brand}的引擎启动了。")
在这个Car类中,__init__是构造函数,用于初始化对象的属性。self是一个特殊的参数,代表对象本身,通过self可以访问和设置对象的属性。start_engine是一个实例方法,用于模拟汽车启动引擎的行为。
2.2 构造函数与析构函数
构造函数(Constructor)是在创建对象时自动调用的特殊方法,用于初始化对象的属性。在 Python 中,构造函数是__init__方法。例如:
class Rectangle:def __init__(self, width, height):self.width = widthself.height = height
在上述代码中,Rectangle类的构造函数接受width和height两个参数,并将它们赋值给对象的属性。
析构函数(Destructor)是在对象被销毁时自动调用的特殊方法,用于释放对象占用的资源。在 Python 中,析构函数是__del__方法。虽然 Python 有自动垃圾回收机制,但在某些情况下,如对象持有外部资源(如文件句柄、数据库连接)时,需要手动清理资源,这时析构函数就很有用。例如:
class FileHandler:def __init__(self, file_path):self.file = open(file_path, 'r')def read_file(self):return self.file.read()def __del__(self):self.file.close()
在这个FileHandler类中,__init__方法打开文件,__del__方法在对象被销毁时关闭文件,确保文件资源被正确释放。
2.3 类的访问控制
在 Python 中,没有严格的访问控制修饰符(如 Java 中的private、public、protected),但通过命名约定来实现类似的访问控制效果。
- 公有(Public):没有下划线开头的属性和方法是公有的,可以在类的内部和外部自由访问。例如前面的Car类中的brand、color属性和start_engine方法都是公有的。
- 私有(Private):以双下划线__开头的属性和方法被视为私有,不能在类的外部直接访问。这是通过名称重整(Name Mangling)机制实现的,Python 会自动修改其名称,以防止外部直接访问,但仍可通过_ClassName__private_attr方式访问,不过不建议这样做。例如:
class BankAccount:def __init__(self, balance):self.__balance = balance # 私有属性def deposit(self, amount):self.__balance += amountdef get_balance(self):return self.__balanceaccount = BankAccount(1000)
# print(account.__balance) # 报错,无法直接访问私有属性
print(account.get_balance()) # 通过公有方法访问私有属性
在上述代码中,__balance是私有属性,外部不能直接访问,但可以通过类内部的公有方法get_balance来获取其值。私有属性和方法主要用于隐藏类的内部实现细节,防止外部随意修改和访问,提高代码的安全性和可维护性。
3.面向对象编程高级特性
3.1 封装
封装是面向对象编程的核心特性之一,它将数据和操作数据的方法包装在一起,形成一个独立的单元,对外隐藏内部实现细节,只暴露必要的接口。通过封装,可以提高代码的安全性、可维护性和可复用性。
在 Python 中,通过定义私有属性和私有方法来实现封装。私有属性和私有方法以双下划线__开头,不能在类的外部直接访问。例如:
class BankAccount:def __init__(self, balance):self.__balance = balance # 私有属性def deposit(self, amount):self.__balance += amountdef withdraw(self, amount):if self.__balance >= amount:self.__balance -= amountreturn Trueelse:return Falsedef get_balance(self):return self.__balance
在上述代码中,__balance是私有属性,外部无法直接访问和修改。通过deposit、withdraw和get_balance这些公有方法来操作和获取私有属性__balance的值,从而保证了数据的安全性和一致性。
3.2 继承
继承是指一个子类可以继承其父类的属性和方法,从而实现代码的复用。子类可以扩展或重写父类的方法,以满足特定的需求。在 Python 中,使用class SubClass(SuperClass)的语法来实现继承。
3.2.1 单继承
单继承是指一个子类只继承一个父类。例如,我们定义一个Animal类作为父类,然后定义Dog类继承自Animal类:
class Animal:def __init__(self, name):self.name = namedef speak(self):print(f"{self.name} makes a sound.")class Dog(Animal):def __init__(self, name, breed):super().__init__(name) # 调用父类的构造函数self.breed = breeddef bark(self):print(f"{self.name} barks: Woof!")
在上述代码中,Dog类继承了Animal类的__init__和speak方法。Dog类的构造函数通过super().__init__(name)调用了父类的构造函数,以初始化从父类继承的属性。Dog类还定义了自己特有的bark方法。
3.2.2 多继承
多继承是指一个子类可以继承多个父类。在 Python 中,多继承通过在类定义时列出多个父类来实现。例如:
class A:def method_a(self):print("This is method A.")class B:def method_b(self):print("This is method B.")class C(A, B):def method_c(self):print("This is method C.")
在上述代码中,C类继承了A类和B类的属性和方法,因此C类的对象可以调用method_a、method_b和method_c方法。
多继承虽然增加了代码的灵活性,但也可能带来一些问题,如菱形继承(Diamond Inheritance)问题,即当一个子类从多个父类继承相同的属性或方法时,可能会导致方法解析顺序(Method Resolution Order,MRO)的混乱。为了解决这个问题,Python 使用 C3 线性化算法来确定方法的解析顺序,可以通过类名.__mro__来查看类的 MRO。例如:
print(C.__mro__)
输出结果类似于:
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
在实际应用中,应谨慎使用多继承,避免代码过于复杂和难以维护。如果需要实现类似多继承的功能,可以考虑使用 mixin 类(一种特殊的类,只包含方法,不包含数据,用于为其他类提供额外的功能)。
3.3 多态
多态是指同一个方法调用在不同的对象上会产生不同的行为。多态性使得程序可以根据对象的实际类型来调用相应的方法,从而提高代码的灵活性和可扩展性。在 Python 中,多态主要通过方法重写和方法重载来实现。
3.3.1方法重写
方法重写是指子类重新定义父类中已有的方法。当子类对象调用该方法时,会执行子类中重写后的方法,而不是父类中的方法。例如:
class Animal:def speak(self):print("The animal makes a sound.")class Dog(Animal):def speak(self):print("The dog barks: Woof!")class Cat(Animal):def speak(self):print("The cat meows: Meow!")def animal_speak(animal):animal.speak()dog = Dog()
cat = Cat()animal_speak(dog) # 输出:The dog barks: Woof!
animal_speak(cat) # 输出:The cat meows: Meow!
在上述代码中,Dog类和Cat类都重写了Animal类的speak方法。animal_speak函数接受一个Animal类型的参数,但在调用animal.speak()时,会根据实际传入的对象类型(Dog或Cat)来执行相应的方法,这就是多态的体现。
3.3.2 方法重载
方法重载是指在同一个类中定义多个同名方法,但这些方法的参数列表不同(参数个数、类型或顺序不同)。在 Python 中,由于 Python 是动态类型语言,不支持传统意义上的方法重载,但可以通过默认参数和可变参数来实现类似的效果。例如:
class Calculator:def add(self, a, b, c=0):return a + b + ccalculator = Calculator()
print(calculator.add(1, 2)) # 输出:3
print(calculator.add(1, 2, 3)) # 输出:6
在上述代码中,add方法通过默认参数c实现了类似方法重载的效果,可以接受两个或三个参数进行加法运算。
3.4 类属性与实例属性
在 Python 中,类属性和实例属性是两种不同类型的属性,它们在定义和使用上有一些区别。
3.4.1 类属性
类属性是属于类本身的属性,被所有类的实例共享。类属性在类定义中直接赋值,不需要使用self关键字。例如:
class Student:school = "ABC School" # 类属性def __init__(self, name):self.name = name # 实例属性student1 = Student("Alice")
student2 = Student("Bob")print(student1.school) # 输出:ABC School
print(student2.school) # 输出:ABC School
print(Student.school) # 输出:ABC School
在上述代码中,school是类属性,name是实例属性。可以通过类名或实例名来访问类属性,但通过实例名修改类属性时,实际上是在实例中创建了一个同名的实例属性,而不会影响类属性本身。例如:
student1.school = "XYZ School"
print(student1.school) # 输出:XYZ School,此时student1的school是实例属性
print(student2.school) # 输出:ABC School,student2的school还是类属性
print(Student.school) # 输出:ABC School,类属性没有改变
如果要修改类属性,应该通过类名来修改:
Student.school = "New School"
print(student1.school) # 输出:XYZ School,student1的实例属性不受影响
print(student2.school) # 输出:New School,student2的school是类属性,已被修改
print(Student.school) # 输出:New School,类属性已被修改
类属性通常用于存储与类相关的常量或共享数据,如学校名称、公司名称等。
3.4.2 实例属性
实例属性是属于类的每个实例的属性,每个实例都有自己独立的一份。实例属性在__init__方法中使用self关键字定义。例如:
class Circle:def __init__(self, radius):self.radius = radius # 实例属性def area(self):return 3.14 * self.radius ** 2circle1 = Circle(5)
circle2 = Circle(10)print(circle1.area()) # 输出:78.5
print(circle2.area()) # 输出:314.0
在上述代码中,radius是实例属性,每个Circle实例都有自己的radius值,因此计算出的面积也不同。实例属性用于存储每个实例特有的数据,如圆形的半径、人的姓名和年龄等。
3.5 类方法与静态方法
类方法和静态方法是 Python 类中两种特殊类型的方法,它们与实例方法有所不同。
3.5.1 类方法
类方法是属于类的方法,而不是属于实例的方法。类方法使用@classmethod装饰器来定义,其第一个参数通常命名为cls,代表类本身。类方法可以通过类名或实例名来调用。例如:
class MathUtils:@classmethoddef add(cls, a, b):return a + bresult = MathUtils.add(3, 5)
print(result) # 输出:8
在上述代码中,add是类方法,通过MathUtils.add调用。类方法通常用于与类相关的操作,如创建对象的工厂方法、访问和修改类属性等。
3.5.2 静态方法
静态方法是与类和实例都没有直接关联的方法,它不依赖于类的状态和实例的状态。静态方法使用@staticmethod装饰器来定义,没有默认的参数。静态方法可以通过类名或实例名来调用。例如:
class StringUtils:@staticmethoddef reverse_string(s):return s[::-1]reversed_str = StringUtils.reverse_string("hello")
print(reversed_str) # 输出:olleh
在上述代码中,reverse_string是静态方法,它只是对字符串进行操作,与类和实例的状态无关。静态方法通常用于实现一些工具函数,这些函数与类的功能相关,但不需要访问类或实例的属性和方法。
4.面向对象编程实战案例
4.1 案例背景介绍
为了更好地理解面向对象编程在实际项目中的应用,我们以一个简单的学生管理系统为例。在学校的教学管理中,需要对学生信息、课程信息以及学生的成绩进行管理。学生管理系统需要实现以下功能:
- 添加学生信息,包括姓名、学号、年龄等。
- 添加课程信息,包括课程名称、课程编号、授课教师等。
- 记录学生的课程成绩。
- 查询学生的个人信息、课程信息以及成绩。
- 统计学生的平均成绩、总成绩等。
4.2 类的设计与实现
根据上述需求,我们设计以下几个类:Student(学生类)、Course(课程类)、Grade(成绩类)和StudentManagementSystem(学生管理系统类)。
4.2.1 Student类
Student类用于表示学生,包含学生的基本信息和相关操作。
class Student:def __init__(self, student_id, name, age):self.student_id = student_idself.name = nameself.age = ageself.grades = {} # 用于存储学生的课程成绩,键为课程对象,值为成绩def add_grade(self, course, grade):self.grades[course] = gradedef get_grades(self):return self.grades
在Student类中,__init__方法用于初始化学生的基本信息,add_grade方法用于添加学生的课程成绩,get_grades方法用于获取学生的所有课程成绩。
4.2.2 Course类
Course类用于表示课程,包含课程的基本信息。
class Course:def __init__(self, course_id, course_name, teacher):self.course_id = course_idself.course_name = course_nameself.teacher = teacher
Course类的__init__方法用于初始化课程的编号、名称和授课教师。
4.2.3 Grade类
Grade类用于表示成绩,目前我们可以简单地将其作为一个数值,在实际应用中可能会包含更多信息,如考试类型、成绩等级等。
# 这里Grade类可以先简单表示为一个数值,实际应用中可扩展
Grade = float
这里我们将Grade类型定义为float,在后续实现中可以根据实际需求进行扩展。
4.2.4 StudentManagementSystem类
StudentManagementSystem类用于管理学生、课程和成绩,提供添加、查询等功能。
class StudentManagementSystem:def __init__(self):self.students = []self.courses = []def add_student(self, student):self.students.append(student)def add_course(self, course):self.courses.append(course)def find_student_by_id(self, student_id):for student in self.students:if student.student_id == student_id:return studentreturn Nonedef find_course_by_id(self, course_id):for course in self.courses:if course.course_id == course_id:return coursereturn Nonedef record_grade(self, student_id, course_id, grade):student = self.find_student_by_id(student_id)course = self.find_course_by_id(course_id)if student and course:student.add_grade(course, grade)else:print("学生或课程不存在。")def get_student_info(self, student_id):student = self.find_student_by_id(student_id)if student:print(f"学生ID: {student.student_id}, 姓名: {student.name}, 年龄: {student.age}")print("课程成绩:")for course, grade in student.get_grades().items():print(f"课程名称: {course.course_name}, 成绩: {grade}")else:print("学生不存在。")
在StudentManagementSystem类中,__init__方法初始化学生列表和课程列表。add_student和add_course方法分别用于添加学生和课程。find_student_by_id和find_course_by_id方法用于根据 ID 查找学生和课程。record_grade方法用于记录学生的课程成绩,get_student_info方法用于获取学生的个人信息和课程成绩。
4.3 功能实现与测试
下面我们通过代码来测试上述类的功能:
# 创建学生管理系统实例
sms = StudentManagementSystem()# 添加学生
student1 = Student("001", "Alice", 20)
sms.add_student(student1)# 添加课程
course1 = Course("C001", "Python Programming", "Dr. Smith")
sms.add_course(course1)# 记录学生成绩
sms.record_grade("001", "C001", 95.0)# 获取学生信息
sms.get_student_info("001")
运行上述代码,我们可以看到以下输出:
学生ID: 001, 姓名: Alice, 年龄: 20
课程成绩:
课程名称: Python Programming, 成绩: 95.0
通过上述代码,我们实现了学生管理系统的基本功能,包括添加学生、课程,记录成绩以及查询学生信息。通过面向对象编程,我们将相关的数据和操作封装在类中,使得代码结构清晰,易于维护和扩展。在实际项目中,可以根据需求进一步完善和扩展这些类的功能,如添加删除学生和课程、修改成绩、统计学生成绩排名等功能。
5.总结与展望
面向对象编程是一种强大的编程范式,通过类和对象的概念,将数据和操作封装在一起,实现了代码的模块化、可维护性和可扩展性。从基础的类定义、构造函数与析构函数,到高级的封装、继承、多态,以及类属性与实例属性、类方法与静态方法等特性,面向对象编程为软件开发提供了丰富的工具和手段。
通过学生管理系统的实战案例,我们看到了面向对象编程在实际项目中的应用。合理地设计类和使用面向对象特性,可以使代码结构清晰、易于理解和维护。在实际开发中,我们应根据具体需求,灵活运用面向对象编程的各种特性,以提高开发效率和代码质量。
随着软件开发的不断发展,面向对象编程也在不断演进。未来,它将继续与其他编程范式(如函数式编程、响应式编程等)相互融合,以适应日益复杂的软件需求。同时,面向对象编程在人工智能、大数据、云计算等领域也将发挥重要作用,为这些领域的发展提供坚实的技术支持。希望本文能帮助读者更好地理解面向对象编程,并在实际编程中熟练运用这一强大的编程范式。
以下是10个关键词的解释:
-
类(Class) :类是创建对象的模板,定义了对象的属性和方法,描述了具有共同特征和行为的一类事物。
-
对象(Object) :对象是类的具体实例,是具有唯一标识的个体,具有类定义的属性和方法。
-
封装(Encapsulation) :封装是将数据和操作数据的方法包装在一起,隐藏内部实现细节,只暴露必要的接口,以提高代码的安全性和可维护性。
-
继承(Inheritance) :继承允许子类继承父类的属性和方法,实现代码复用,子类还可以扩展或重写父类的方法以满足特定需求。
-
多态(Polymorphism) :多态是指同一个方法调用在不同的对象上会产生不同的行为,使得程序可以根据对象的实际类型来调用相应的方法,提高代码的灵活性和可扩展性。
-
构造函数(Constructor) :构造函数是在创建对象时自动调用的方法,用于初始化对象的属性,确保对象在创建时处于有效状态。
-
析构函数(Destructor) :析构函数是在对象被销毁时自动调用的方法,用于释放资源,进行清理工作。
-
类属性(Class Attribute) :类属性是属于类本身的属性,被所有类的实例共享,通常用于存储与类相关的常量或共享数据。
-
实例属性(Instance Attribute) :实例属性是属于类的每个实例的属性,每个实例都有自己独立的一份,用于存储每个实例特有的数据。
-
类方法(Class Method) :类方法是属于类的方法,而不是属于实例的方法,可以通过类名或实例名来调用,通常用于与类相关的操作,如创建对象的工厂方法、访问和修改类属性等。
相关文章推荐:
1、Python详细安装教程(大妈看了都会)
2、02-pycharm详细安装教程(大妈看了都会)
3、如何系统地自学Python?
4、Alibaba Cloud Linux 3.2104 LTS 64位 怎么安装python3.10.12和pip3.10
5、职场新技能:Python数据分析,你掌握了吗?
6、Python爬虫图片:从入门到精通
串联文章:
1、Python小白的蜕变之旅:从环境搭建到代码规范(1/10)
相关文章:
Python面向对象编程实战:从类定义到高级特性的进阶之旅(2/10)
摘要:本文介绍面向对象编程基础概念,包括类与对象、封装、继承和多态等。以Python语言为例,详细讲述了类的定义与使用、构造函数与析构函数、类的访问控制等。面向对象编程通过将数据和操作封装在一起,提高代码的模块化和可维护性…...
【AI论文】DeepCritic:使用大型语言模型进行有意识的批判
摘要:随着大型语言模型(LLMs)的快速发展,对其输出提供准确的反馈和可扩展的监督成为一个紧迫而关键的问题。 利用LLM作为评判模型来实现自动化监督是一种有前景的解决方案。 在这项工作中,我们专注于研究和提高LLM的数…...
硬件工程师面试常见问题(12)
第五十六问:PCI总线基本知识 关于PCI总线的描述,错误的是:(A)(4分) A.PCI总线是一个16位宽的总线。 B.PCI的地址线与数据线是复用的。 C.PCI是一种独立于处理器的总线标准,可以支持多种处理器。 D.PCI支持即插即用功能。 解释: …...
大数据Spark(五十八):Spark Pi介绍
文章目录 Spark Pi介绍 Spark Pi介绍 Spark Pi是Apache Spark官方提供的一个示例程序,该案例使用 Spark 进行分布式计算,通过蒙特卡罗方法估算圆周率(π)的值,其估算π原理如下: 上图中,正方形…...
深入理解 HttpExchange_Java 中构建 HTTP 服务的基础组件
1. 引言 1.1 Java 中的轻量级 HTTP 服务需求 随着微服务、工具类应用和嵌入式系统的兴起,开发者对轻量级 HTTP 服务的需求日益增长。相比引入庞大的框架(如 Spring Boot),使用 JDK 原生 API 构建 HTTP 服务成为一种快速、低依赖的替代方案。 JDK 提供了 com.sun.net.htt…...
MaC QT 槽函数和Lambda表达式
在C Qt框架中,槽函数(Slot)是一种特殊的成员函数,用于响应信号(Signal)的触发,从而实现对象间的通信和事件处理。 #include<QMessageBox>//包含槽函数的头文件 //定义槽函数 响应特定的信…...
JMM 与 JVM 运行时数据区有什么区别和联系?
JMM(Java Memory Model)和 JVM 运行时数据区(JVM Runtime Data Areas)是 Java 内存管理中的两个不同但密切相关的概念。 1. JVM 运行时数据区 (JVM Runtime Data Areas) 是什么? JVM 运行时数据区是 JVM 在程序执行过程…...
LeetCode Hot100题解
目录 一、数组 & 字符串 1. 两数之和(简单) 2. 删除有序数组中的重复项(简单) 3. 移除元素(简单) 4. 合并两个有序数组(简单) 5. 买卖股票的最佳时机(简单&…...
基于Jenkins的DevOps工程实践之Jenkins共享库
文章目录 前言Jenkins共享库结构1、共享库演示2、知识点补充3、实践使用共享库格式化输出日志4、groovy基础语法4.1、 什么是 Groovy?4.2、groovy特点4.3、运行方法4.4、标识符4.5、基本数据类型4.5.1、string类型4.5.2、list类型 4.6、函数使用4.7、正则表达式 5、…...
【安装指南】Docker 安装最新版 Nginx 并进行项目的编排
目录 一、Nginx 的介绍 1.1 开源版 Nginx ① 访问路由 ② 反向代理 ③ 负载均衡 ④ 内容缓存 ⑤ 可编程 1.2 商业版 Nginx Plus ① 负载均衡 ② 动态管理 ③ 安全控制 ④ 状态监控 ⑤ Kubernetes Ingress Controller ⑥ 流媒体 1.3 扩…...
MFC自定义控件开发与使用指南
MFC自定义控件开发与使用指南 1. 概述 MFC(Microsoft Foundation Classes)框架提供了丰富的内置控件,但在实际开发中,我们常常需要创建自定义控件来满足特定的界面需求。本文将详细介绍如何在MFC中开发自定义控件,并以CCustomTextControl为例,展示自定义控件的实现和使…...
Learning vtkjs之PolyDataNormals
法线可视化 介绍 polydata法线可视化 效果 核心代码 主要流程 const fullScreenRenderer vtkFullScreenRenderWindow.newInstance({background: [0, 0, 0],rootContainer: vtkContainerRef.current,});const renderer fullScreenRenderer.getRenderer();const renderWind…...
DeepSeek辅助学术写作之提交和出版以及评审过程分析提示词分享祝你顺利毕业~
目录 1.提交和出版 2.评审过程 大家好这里是AIWritePaper官方账号,官网👉AIWritePaper~ 宝子们可以使用小编精选的“ChatGPT研究论文提示词”集合来创建研究论文。利用DeepSeek的智能回应生成详尽有效的内容,这样可以加快研究论文的策划、创…...
基于机器学习的心脏病数据分析与可视化(百度智能云千帆AI+DeepSeek人工智能+机器学习)健康预测、风险评估与数据可视化 健康管理平台 数据分析与处理
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
Kubernetes(k8s)学习笔记(四)--入门基本操作
本文通过kubernetes部署tomcat集群,来学习和掌握kubernetes的一些入门基本操作 前提条件 1.各个节点处于Ready状态; 2.配置好docker镜像库(否则会出现ImagePullBackOff等一些问题); 3.网络配置正常(否则即使应用发布没问题,浏…...
在Java项目中实现本地语音识别与热点检测,并集成阿里云智能语音服务
引言 随着语音交互技术的发展,如何高效地处理用户的语音输入成为许多应用的重要课题。本文将详细介绍如何在一个Java项目中同时实现: 基于Vosk的本地语音识别:无需调用云端API即可完成语音到文本的转换。本地热点语音内容识别:对…...
C++八股--5--设计模式--适配器模式,代理模式,观察者模式
3. 观察者模式(也叫做观察者-监听者模式,发布-订阅模式) 主要关注对象的一对多关系,也就是多个对象都依赖于一个对象,当该对象状态改变时,其余对象都能得到对应的通知 如:一组数据(数…...
Ubuntu下安装Node.js
一、引言 Ubuntu下安装Node.js主要有两种方式:通过apt安装和通过源码安装。本文主要讲解通过apt安装Node.js的方法。 二、通过apt安装Node.js 安装Node.js: apt install nodejs 我之前已经安装过了,所以提示:“nodejs 已经是最…...
用单目相机和apriltag二维码aruco实现单目定位
目录 一、核心流程与代码框架 1. 环境准备 2. ArUco定位实现 3. AprilTag定位实现(需额外安装Apriltag库) 二、关键优化点 1.亚像素角点优化 2 多标签联合定位 三、性能指标(实测) 四、常见问题 检测失败…...
AIGC算力消耗白皮书:Stable Diffusion vs Midjourney的架构成本差异
引言:文生图模型的算力经济学悖论 当Midjourney单日处理超过4000万张图像请求时,其云服务算力成本却低于Stable Diffusion开源方案的37%。这揭示了一个核心矛盾:开源模型的架构自由度与闭源系统的商业优化之间存在根本性博弈。本文基于H800 …...
介绍 PHP-FPM 和 Python WSGI
我来详细介绍 PHP-FPM 和 Python WSGI,它们是现代Web开发中替代传统CGI的高性能解决方案,分别针对PHP和Python优化。 1. PHP-FPM(FastCGI Process Manager) 是什么? PHP-FPM 是PHP的 FastCGI 进程管理器,…...
赛季7靶场 -- Checker --User flag
本系列仅说明靶场的攻击思路,不会给出任何的详细代码执行步骤,因为个人觉得找到合适的工具以实现攻击思路的能力也非常重要。root要逆向,没做了,但是user flag也有借鉴意义,关于2FA的绕过我们有必要了解 1.首先Nmap扫描…...
【c语言】数据在内存中的存储
一、 大小端字节序 大端字节序:数据的低字节内容存放在内存的高地址处,数据的高字节内容存放在内存的低地址处,对于0x11223344 小端字节序:数据的低字节内容存放在内存的低地址处,数据的高字节内容存放在内存的高地…...
【Unity】XLua访问C#文件
创建NPC.cs: public class NPC { public string name; public int age; public void Say() { Debug.Log("Say:我是未被修改的"); } public static void Say() { Debug.Log("Static Say:我是未被修改的"); } public void Say2(int a) { Debug.Lo…...
Python实例题:Python获取房天下数据
目录 Python实例题 题目 实现思路 代码实现 代码解释 get_fangtianxia_data 函数: 主程序: 运行思路 注意事项 Python实例题 题目 Python获取房天下数据 实现思路 请求网页:使用 requests 库向房天下二手房页面发送请求…...
Milvus(12):分析器
1 分析器概述 在文本处理中,分析器是将原始文本转换为结构化可搜索格式的关键组件。每个分析器通常由两个核心部件组成:标记器和过滤器。它们共同将输入文本转换为标记,完善这些标记,并为高效索引和检索做好准备。 在 Milvus 中&a…...
小程序滚动条隐藏(uniapp版本)
单独指定页面隐藏(找到对应的scroll-view) <style> /* 全局隐藏滚动条样式 */ ::-webkit-scrollbar { display: none; width: 0; height: 0; color: transparent; background: transparent; } /* 确保scroll-view组件也隐藏滚动条 */ …...
在 Trae CN IDE 中配置 Python 3.11的指南
在 Trae CN IDE 中配置 Python 3.11的指南 下载 python 3.11 安装 Python 3.11 首先,我们需要确保安装了 Python 3.11。可以从Python 官方网站下载适合你操作系统的版本。 链接 如果你已经安装了 Python 3.11,可以通过以下命令确认: 文…...
AI 大模型常见面试题(及内容解析)
大模型领域包含许多专业术语,以下是一些关键术语的解释: 人工智能(AI):是指使计算机系统能够模拟人类智能行为,以执行任务、解决问题和学习的科学和技术。 大型语言模型(LLM)&#…...
QT —— QWidget(1)
QT —— QWidget(1) QWidget是啥通俗解释:QWidget 是什么?1. QWidget 能干什么?2. 举个栗子 🌰3. QWidget 的特点4. 和“控件”是什么关系?5. 什么时候用 QWidget?6. 总结 QWidget 核…...
with的用法
Python SQLite 操作详解 本文档详细解释了使用 Python 操作 SQLite 数据库时涉及的关键概念和代码实践,包括 with 语句、事务处理、批量插入以及相关的优化建议。 一、with 语句的作用(自动关门的保险库) with sqlite3.connect(city_1301.d…...
Go反射-通过反射调用结构体的方法(带入参)
使用反射前,我们需要提前做好映射配置 papckage_struct_relationship.go package reflectcommonimport (api "template/api" )// 包名到包对象的映射 var structMap map[string]func() interface{}{"template/api": func() interface{} { re…...
C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 19)
🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 二…...
使用 Selenium 爬取动态网页数据 —— 实战与坑点详解
本文记录了笔者在爬取网页数据过程中遇到的各种技术挑战,包括页面动态渲染、JavaScript 注入等问题,并最终给出一个可运行的完整方案。 文章目录 网页获取不到数据🚀 尝试用 Selenium 渲染页面 网页获取不到数据 某网页数据依赖大量 JavaSc…...
强化学习--2.数学
强化学习--数学 1、概率统计知识1.1 随机变量与观测值1.2 概率密度函数(PDF)1.3 期望1.4 随机抽样 2、数据期望E3、正态分布4、条件概率1. **与多个条件相关**(依赖所有前置条件)2. **仅与上一个条件相关**(马尔可夫性…...
rails 8 CSS不起效问题解决
很久没用rails了,最近打算重新复习一下。在配置好环境后,创建了项目,通过脚手架创建了数据库表,和相关的文件。但我发现却没有生成相应的CSS文件,可能是rails8 取消了吧。于是自己手动创建了相应的css文件。但是刷新页…...
双指针算法详解(含力扣和蓝桥杯例题)
目录 一、双指针算法核心概念 二、常用的双指针类型: 2.1 对撞指针 例题1:盛最多水的容器 例题2:神奇的数组 2.2 快慢指针: 例题1:移动零 例题2:美丽的区间(蓝桥OJ1372) 3.总…...
C 语言字符输入:掌握 getchar 和 scanf 的用法与陷阱
各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474 C 语言字符输入:掌握 getchar 和 scanf 的用法与陷阱 你好!在 C 语言编程中,与用户进行交互最基本的方式就是通过标准输入和标准输出。我们之前探讨了如何使用 printf 和 putchar 进行…...
算法笔记。质数筛算法
题目: 给定一个正整数 n,请你求出 1∼n 中质数的个数。 输入格式 共一行,包含整数 n。 输出格式 共一行,包含一个整数,表示 1∼n 中质数的个数。 数据范围 1≤n≤106 输入样例: 8输出样例…...
C语言中memmove和memcpy
1、memmove()函数 void *memmove(void *str1, const void *str2, size_t n); 将str2所指向的存储区的前n个字节复制到str1所指向的存储区。 memmove()允许“str1和str2所指向的存储区重叠”。通过检查地址关系,自动选择复制方向(从前往后或从后往前&a…...
GESP2024年6月认证C++八级( 第三部分编程题(2)空间跳跃)
参考程序: #include <cstdio> #include <vector> #include <queue> #include <utility> #include <cstring> using namespace std;// 定义一个结构体,用于 Dijkstra 优先队列中的节点 struct Node {int v, w; // v 表示图…...
使用DeepSeek定制Python小游戏——以“俄罗斯方块”为例
前言 本来想再发几个小游戏后在整理一下流程的,但是今天试了一下这个俄罗斯方块的游戏结果发现本来修改的好好的的,结果后面越改越乱,前面的版本也没保存,根据AI修改他是在几个版本改来改去,想着要求还是不能这么高。…...
Linux中安装mysql8,转载及注意事项
一、先前往官网下载mysql8 下载地址: https://dev.mysql.com/downloads/选择Linux 二、删除Linux中的mysql(如果有的话),上传安装包 1、先查看mysql是否存在,命令如下: rpm -qa|grep -i mysql如果使用这…...
网站即时备份,网站即时备份的方法有哪些
网站数据的安全性与业务连续性直接关系到企业的核心竞争力。无论是因硬件故障、人为误操作、网络攻击还是自然灾害,数据丢失或服务中断都可能带来难以估量的损失。因此,网站即时备份成为保障业务稳定性的关键技术手段。 一、核心即时备份技术方案 云服…...
LVM扩容小计
文章目录 [toc]当前磁盘使用问题分析关键问题定位推荐解决方案方案一:扩展根分区(LVM 动态扩容)方案二:清理磁盘空间(紧急临时处理) 当前磁盘使用问题分析 根据你的磁盘信息,根文件系统 (/) 已…...
【2025软考高级架构师】——案例分析总结(13)
摘要 本文对2025年软考高级架构师的考纲及案例分析进行了总结。内容涵盖系统规划、架构设计、系统建模、安全架构、可靠性分析、大数据架构等多方面知识点,还涉及软件质量特性、系统流程图与数据流图、嵌入式系统架构、分布式系统设计等考查内容,详细列…...
Redis ⑨-Jedis | Spring Redis
Jedis 通过 Jedis 可以连接 Redis 服务器。 通过 Maven 引入 Jedis 依赖。 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><versi…...
aidermacs开源程序使用 Aider 在 Emacs 中进行 AI 配对编程
一、软件介绍 文末提供程序和源码下载 Aidermacs 通过集成 Aider(最强大的开源 AI 配对编程工具之一)为 Emacs 带来了 AI 驱动的开发。如果您缺少 Cursor,但更喜欢生活在 Emacs 中,Aidermacs 提供了类似的 AI 功能,同…...
HarmonyOS NEXT——DevEco Studio的使用(还没写完)
一、IDE环境的搭建 Windows环境 运行环境要求 为保证DevEco Studio正常运行,建议电脑配置满足如下要求: 操作系统:Windows10 64位、Windows11 64位 内存:16GB及以上 硬盘:100GB及以上 分辨率:1280*8…...
使用PageHelper实现分页查询(详细)
一:需求分析与设计 1.1 产品原型 (1)分页展示,每页展示10条数据,根据员工姓名进行搜索 (2)业务规则 1.2 接口设计 (1)操作:查询,请求方式…...