当前位置: 首页 > news >正文

Python青少年简明教程:类和对象入门

Python青少年简明教程:类和对象入门

Python支持多种编程范式(programming paradigms),即支持多种不同的编程风格和方法。初学者开始重点学习关注的编程范式,一般而言是面向过程编程和面向对象编程。面向过程编程(Procedural Programming)它关注于通过过程(或称为函数、子程序)来组织程序的逻辑。它是命令式编程(Imperative Programming)的一种具体风格。

【Python也支持函数式编程(Functional Programming)的一些特性,如lambda函数、map()、filter()等。

Python也支持事件驱动编程(Event-Driven Programming),这编程范式特别适用于创建响应式和交互式的应用程序。Python提供了多种方式来实现事件驱动编程:使用标准的(内置的)库tkinter(Python的标准GUI库,适合创建简单的桌面应用), 标准库中的asyncio模块(提供了对异步编程的支持。它可以处理事件循环、协程、任务和事件驱动编程), 一些第三方库(如PyQt用于创建GUI应用,pygame:用于游戏开发)等。】

前面的介绍的编程,主要是面向过程编程(Procedural Programming)它关注于通过过程(或称为函数、子程序)来组织程序的逻辑。它是命令式编程(Imperative Programming)的一种具体风格。

作为对比,先概括面向过程编程风格的特点。面向过程编程是命令式编程的一种具体风格。它主要关注于:

    将程序分解为一系列的过程(也称为函数或子程序)

    这些过程按顺序执行,每个过程执行特定的任务

    强调代码的重用和模块化

示例:

def calculate_area(length, width):return length * widthdef calculate_perimeter(length, width):return 2 * (length + width)# 使用函数
room_length = 5
room_width = 4
area = calculate_area(room_length, room_width)
perimeter = calculate_perimeter(room_length, room_width)print(f"房间面积:{area}平方米")
print(f"房间周长:{perimeter}米")

面向对象编程呢?这是另一种重要的范式,它主要关注于:

    将数据和操作数据的方法组织到对象中

    使用类来创建对象

    支持封装、继承和多态等概念

示例:

class Room:def __init__(self, length, width):self.length = lengthself.width = widthdef calculate_area(self):return self.length * self.widthdef calculate_perimeter(self):return 2 * (self.length + self.width)# 使用类
my_room = Room(5, 4)
print(f"房间面积:{my_room.calculate_area()}平方米")
print(f"房间周长:{my_room.calculate_perimeter()}米")

下面将介绍Python面向对象编程知识。

Python是一种面向对象编程(OOP)的语言,类和对象是其核心概念。

类(Class

类 是对象的蓝图或模板,它定义了一组属性和方法,这些属性和方法被具体的对象实例所共享。

基本语法:

class ClassName:
    # 类体
    pass

【注:pass 是一个特殊语句,它主要用作占位符,不会改变程序的执行流程,但pass 是一个语句,是一个语法上的无操作语句,它的出现能避免不写任何语句时的语法错误。】

下面给出定义类的包含比较全面的语法:
class ClassName:
    # 类属性
    class_attribute = value

    # 初始化方法
    def __init__(self, parameter1, parameter2):
        self.instance_attribute1 = parameter1
        self.instance_attribute2 = parameter2

    # 实例方法
    def instance_method(self):
        # 方法体
        pass

    # 类方法
    @classmethod
    def class_method(cls):
        # 方法体
        pass

    # 静态方法
    @staticmethod
    def static_method():
        # 方法体
        pass

类和对象的说明

属性 (Attributes): 对象具有的数据。

方法 (Methods): 对象可以执行的操作。

实例化 (Instantiation): 使用类创建对象的过程。

self: 在方法定义中,self 代表当前对象,用于访问修改对象的属性和方法。

实例属性:定义在 __init__ 方法中的属性,用 self 引用。每个对象都有自己独立的实例属性。

类属性:在类体内直接定义,用 ClassName.attribute 或 self.__class__.attribute 引用。所有对象共享类属性。

实例方法:定义在类内部,以 self 作为第一个参数的方法。用于操作对象实例的属性。

类方法:使用 @classmethod 装饰器定义,以 cls 作为第一个参数的方法。用于操作类属性。

静态方法:使用 @staticmethod 装饰器定义,不需要 self 或 cls 参数。通常与类或实例无关。

必须的部分:

class ClassName: 这是定义类的基本语法,是必须的。

常用但不是必须的部分:

__init__ 方法:虽然不是严格必需的,但在大多数情况下都会定义,用于初始化对象。

实例属性:通常在 __init__ 中定义,但也可以在其他方法中定义。

可选但常见的部分:

类属性:不是必须的,但在需要所有实例共享某些属性时很有用。

实例方法:定义对象的行为,是面向对象编程的核心,但并非每个类都必须有。

类方法和静态方法:这些是更高级的概念,根据具体需求使用。

另外,Python 使用命名约定(如单下划线前缀)来表示私有或保护成员,而不是严格的访问控制。

需要注意,重要的是理解这些组件的作用,并根据具体情况选择使用。过度设计(如在不需要的地方使用类方法或静态方法)可能会使代码不必要地复杂。

Python类中各种成员的用途和注意事项:

☆类属性(Class Attributes)

用途:

    存储所有实例共享的数据

    定义类级别的常量

    跟踪类的全局状态

注意事项:

    可以通过类名或实例访问

    修改时要小心,因为会影响所有实例

    可能被实例属性覆盖

☆实例属性(Instance Attributes)

用途:

    存储每个实例特有的数据

    定义对象的状态

注意事项:

    通常在__init__方法中初始化,使用self定义的变量

    只能通过实例访问

    每个实例可以有不同的值

☆实例方法(Instance Methods)

用途:

    定义对象的行为

    操作实例的状态

注意事项:

    第一个参数总是self,代表实例本身

    可以访问和修改实例属性

    通过实例调用

☆类方法(Class Methods)

用途:

    操作类属性

    实现替代构造器

注意事项:

    使用@classmethod装饰器

    第一个参数通常命名为cls,代表类本身

    可以通过类或实例调用

    不能直接访问实例属性

☆静态方法(Static Methods)

用途:

    实现与类相关但不需要访问类或实例状态的功能

    组织代码结构

注意事项:

    使用@staticmethod装饰器

    不需要特殊的首参数

    可以通过类或实例调用(不建议通过实例调用)

    不能访问类或实例属性

☆魔术方法(Magic Methods),也称为特殊方法

用途:

    定制类的特殊行为,用于实现特定的功能,如对象初始化、字符串表示、运算符重载等。

注意事项:

    以双下划线开始和结束,如__init__、str、__len__等

    在特定情况下自动调用

    可以极大地增强类的功能和灵活性

☆属性装饰器(Property Decorators)

用途:

    将方法调用伪装成属性访问(可以像访问属性一样访问)

    实现计算属性

    控制属性的访问、设置和删除

注意事项:

    使用@property装饰器

    可以定义getter、setter和deleter

    提供了一种优雅的方式来封装数据访问

☆内部类(Nested Classes)

用途:

    将相关类组织在一起

    封装辅助类

注意事项:

    定义在另一个类的内部

    可以访问外部类的属性

    通常用于实现辅助功能或数据结构

☆私有成员(Private Members)

用途:

    隐藏实现细节

    防止直接访问和修改

注意事项:

    以双下划线__开头

    Python通过名称改写机制实现

    可以通过特殊方式访问,不是绝对私有

☆保护成员(Protected Members)

用途:

    表示应该被视为内部使用的成员

    在继承中使用

注意事项:

    以单下划线_开头

    这只是一个约定,并不强制执行,实际可以被外部访问,但不应该

特别提示,实际使用时,合理使用各种成员类型,有些部分不一定出现,选择合适的类型可以使您的代码更加清晰和高效。

Python类的成员类型和概念很多,一次性全部掌握是有难度的。这是很正常的学习过程,可以先集中精力关注您不需要一次掌握所有内容。随着您编写更多的Python代码,这些概念会变得越来越清晰。最常用的部分,如实例属性、实例方法、类方法和静态方法。基础示例:

class Car:total_cars = 0  # 类属性def __init__(self, make, model):self.make = make    # 实例属性self.model = model  # 实例属性Car.total_cars += 1def display_info(self):  # 实例方法return f"{self.make} {self.model}"@classmethoddef get_total_cars(cls):  # 类方法return cls.total_cars@staticmethoddef honk():  # 静态方法return "Beep beep!"# 使用类
my_car = Car("Toyota", "Corolla")
print(my_car.display_info())  # 输出: Toyota Corolla
print(Car.get_total_cars())   # 输出: 1
print(Car.honk())             # 输出: Beep beep!

这个例子涵盖了基本的类属性、实例属性、实例方法、类方法和静态方法。您可以从这里开始,逐步理解每个概念的作用和使用场景。

Python 中类的方法确实与普通函数比较

在 Python 中,类的方法确实与普通函数在很多方面都是类似的。两张比较如下:

相似之处:

a) 定义方式:

类方法和普通函数都使用 def 关键字定义。

b) 参数传递:

两者都可以接受位置参数、关键字参数、默认参数、*args 和 **kwargs。

c) 返回值:

两者都可以有返回值,使用 return 语句。

d) 文档字符串:

两者都可以使用文档字符串(docstrings)来描述其功能。

e) 装饰器:

两者都可以使用装饰器来修改或增强功能。

主要区别:

a) self 参数:

类方法的第一个参数通常是 self,代表类的实例。普通函数没有这个要求。

b) 访问范围:

类方法可以访问类的属性和其他方法,而普通函数不能直接访问类的内部结构。

c) 调用方式:

类方法通常通过类的实例调用,而普通函数直接调用。

d) 特殊方法:

类可以有特殊方法(如 __init__, __str__ 等),这在普通函数中不存在。

让我们通过一个例子来说明这些相似点和区别:

# 普通函数
def regular_function(x, y, *args, **kwargs):"""这是一个普通函数的文档字符串"""print(f"Regular function: x={x}, y={y}, args={args}, kwargs={kwargs}")# 类定义
class ExampleClass:def __init__(self, name):self.name = namedef class_method(self, x, y, *args, **kwargs):"""这是一个类方法的文档字符串"""print(f"{self.name}: x={x}, y={y}, args={args}, kwargs={kwargs}")@staticmethoddef static_method(x, y):"""这是一个静态方法"""print(f"Static method: x={x}, y={y}")# 使用普通函数
regular_function(1, 2, 3, 4, a=5, b=6) # 输出:Regular function: x=1, y=2, args=(3, 4), kwargs={'a': 5, 'b': 6}# 使用类方法
obj = ExampleClass("MyObject")
obj.class_method(1, 2, 3, 4, a=5, b=6) # 输出:MyObject: x=1, y=2, args=(3, 4), kwargs={'a': 5, 'b': 6}# 使用静态方法
ExampleClass.static_method(1, 2) # 输出:Static method: x=1, y=2

这个例子展示了普通函数和类方法在定义和使用上的相似性,同时也突出了它们的一些区别,特别是 self 参数的使用和调用方式的不同。

总的来说,Python 的设计使得类方法在使用上感觉非常像普通函数,这是 Python 简洁和一致性设计哲学的体现。这种相似性使得从函数式编程转向面向对象编程变得相对容易。

下面介绍封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)等内容,很重要,但涉及内容广泛,在此仅作简要介绍,作为初学者可以先作为了解内容。

封装(Encapsulation

封装是将数据(属性)和行为(方法)隐藏在类内部,只通过公开的方法访问。

私有属性和方法:通过在属性或方法名前加两个下划线 __ 实现。示例:

class Person:def __init__(self, name, age):self.__name = name  # 私有属性self.__age = agedef get_name(self):return self.__namedef get_age(self):return self.__ageperson = Person("Alice", 30)
print(person.get_name())  # 输出: Alice
print(person.get_age())  # 输出: 30
# print(person.__name)  # 会报错,无法直接访问私有属性

在 Python 中,高级封装可以属性装饰器(@property)和property()函数。

Python中的property:@property装饰器和 property() 函数,它们都是用来创建托管属性(managed properties)的机制,允许你对属性的获取、设置和删除操作进行精细控制。这两种方法本质上是实现相同功能(功能等价)的不同语法。这是一种更现代、更简洁的语法,通常在新代码中更常用。property()函数这是较早的语法,但仍然完全有效和有用。@property装饰器实际上是property()函数的语法糖。

选择哪种主要取决于个人偏好和具体的使用场景。

Python使用装饰器(@property)来实现getter和setter的功能。例如:

class Circle:def __init__(self, radius):self._radius = radius@propertydef radius(self):"""Getter for radius"""return self._radius@radius.setterdef radius(self, value):"""Setter for radius"""if value <= 0:raise ValueError("半径必须为正数")self._radius = value@propertydef area(self):"""Getter for area"""return 3.14 * self._radius ** 2circle = Circle(5)
print(circle.radius)  # 输出: 5
circle.radius = 10    # 使用setter
print(circle.radius)  # 输出: 10
print(circle.area)    # 输出: 约 314.0# circle.radius = -1  # 会抛出 ValueError: 半径必须为正数

说明(解释):

a. @property装饰器:

    将方法转换为只读属性

    通常用作getter

b. @[属性名].setter装饰器:

    定义属性的setter方法

    允许设置属性值时进行验证或处理

c. 只读属性:

    只定义@property而不定义setter,创建只读属性

property()函数

property() 函数是 Python 内置函数,用于创建和返回 property 对象。它提供了另一种方式来定义属性,而不是使用装饰器语法。

property() 函数的基本语法是:

property(fget=None, fset=None, fdel=None, doc=None)

其中:

    fget:获取属性值的函数(getter)

    fset:设置属性值的函数(setter)

    fdel:删除属性的函数(可选)

    doc:属性的文档字符串(可选)

例如(一个完整的、可运行的使用property() 函数示例):

class Circle:def __init__(self, radius):self._radius = radiusdef get_radius(self):print("Getting radius")return self._radiusdef set_radius(self, value):print("Setting radius")if value <= 0:raise ValueError("半径必须为正数")self._radius = valuedef del_radius(self):print("Deleting radius")del self._radiusradius = property(get_radius, set_radius, del_radius, "圆的半径属性")# 使用这个类
circle = Circle(5)print(circle.radius)  # 获取半径
circle.radius = 10    # 设置半径
print(circle.radius)  # 再次获取半径
del circle.radius     # 删除半径# 查看属性的文档
print(Circle.radius.__doc__)# 尝试设置无效值
try:circle.radius = -1
except ValueError as e:print(f"错误: {e}")

说明(解释):

我们定义了 get_radius、set_radius 和 del_radius 方法。

使用 property() 函数创建了 radius 属性,将这些方法关联起来。

当我们访问、修改或删除 radius 属性时,相应的方法被调用。

我们还可以访问属性的文档字符串。

当尝试设置无效值时,会引发 ValueError。

使用 property() 函数的优点是它提供了一种更灵活的方式来定义属性,特别是在需要动态创建属性或在运行时修改属性行为时。然而,对于大多数简单的情况,使用 @property 装饰器语法通常更为简洁和常见。

运行这个程序的输出是:

Getting radius
5
Setting radius
Getting radius
10
Deleting radius
圆的半径属性
Setting radius
错误: 半径必须为正数

继承(Inheritance

继承是面向对象编程中的一个重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。

定义子类的语法:

class SubClass(ParentClass):
    # 子类定义
 

示例:

class Animal:def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError("Subclass must implement this method")class Cat(Animal):def speak(self):return f"{self.name} says meow"class Dog(Animal):def speak(self):return f"{self.name} says woof"cat = Cat("Whiskers")
dog = Dog("Buddy")print(cat.speak())  # 输出: Whiskers says meow
print(dog.speak())  # 输出: Buddy says woof

多重继承(Multiple Inheritance)

Python 支持多重继承,一个子类可以继承多个父类。

语法:

class SubClass(ParentClass1, ParentClass2):
    # 子类定义

示例:

class Swimmable:def swim(self):return "I can swim"class Flyable:def fly(self):return "I can fly"class Duck(Swimmable, Flyable):passduck = Duck()
print(duck.swim())  # 输出: I can swim
print(duck.fly())  # 输出: I can fly

多态(Polymorphism

在 Python 中,多态(Polymorphism)是指不同的对象对同一操作的不同响应方式。这意味着,您可以用相同的方式处理不同类型的对象,而不需要了解它们具体的类型。多态通常通过继承与方法重写(override)来实现。例如:

class Shape:def area(self):passclass Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.heightclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2def print_area(shape):print(f"The area is: {shape.area()}")# 创建不同的形状
rect = Rectangle(5, 4)
circ = Circle(3)# 用相同的函数处理不同的对象
print_area(rect)  # 输出: The area is: 20
print_area(circ)  # 输出: The area is: 28.26

说明,在这个例子中:

Shape 是一个基类,定义了 area 方法。

Rectangle 和 Circle 继承自 Shape,并重写了 area 方法。

print_area 函数接受一个 Shape 对象,并调用其 area 方法。

我们可以传入 Rectangle 或 Circle 的实例,print_area 函数会正确调用相应的 area 方法。

这个例子展示了如何通过继承和方法重写来实现多态,也展示了如何用相同的方式(调用 print_area 函数)处理不同类型的对象。

方法重写(Method Overriding)

子类可以重写父类的方法,提供自己的实现。

示例:

class Bird:def speak(self):return "Bird sound"class Parrot(Bird):def speak(self):return "Parrot says squawk"bird = Bird()
parrot = Parrot()print(bird.speak())  # 输出: Bird sound
print(parrot.speak())  # 输出: Parrot says squawk

最后总结一下Python中的self的作用。

self小结:

Python中的self是一个在面向对象编程中非常重要的概念。self 是一个约定俗成的名称,通常用于代表一个类的实例。它作为实例方法的第一个参数来访问对象的属性和方法。 self 的作用:

1)用于访问和修改实例变量(也称为实例的属性)。

2)用于调用其他实例方法。

示例:

class Person:def __init__(self, name, age):self.name = name  # 使用 self 设置实例变量self.age = agedef introduce(self):print(f"我是 {self.name},今年 {self.age} 岁")  # 使用 self 访问实例变量def have_birthday(self):self.age += 1  # 使用 self 修改实例变量self.introduce()  # 使用 self 调用其他实例方法# 创建实例
person = Person("Alice", 30)
person.introduce()  # 输出:我是 Alice,今年 30 岁
person.have_birthday()  # 输出:我是 Alice,今年 31 岁

关于self重要说明

self 必须作为第一个参数传递给实例方法,但在调用时不需要传递,Python 会自动处理。

self不是Python的关键字,而是个常用约定,但你可以使用其他名称,但是不建议这样做,以保持代码的可读性和一致性。

在__init__中,self指向新创建的实例。(__init__是一个特殊方法,用于初始化新创建的对象。)

访问实例变量时总是需要使用self前缀。

实例方法的定义需要包含self,在类方法 (使用@classmethod装饰器) 和静态方法 (使用@staticmethod装饰器) 中,self 不再使用,类方法使用cls作为第一个参数;静态方法不使用特殊的第一个参数。

在子类中,self仍然指向当前实例,即使方法是从父类继承的。

附录

Python面向对象程序设计 https://blog.csdn.net/cnds123/article/details/108354860

Python中的property介绍 https://blog.csdn.net/cnds123/article/details/129420059

相关文章:

Python青少年简明教程:类和对象入门

Python青少年简明教程&#xff1a;类和对象入门 Python支持多种编程范式&#xff08;programming paradigms&#xff09;&#xff0c;即支持多种不同的编程风格和方法。初学者开始重点学习关注的编程范式&#xff0c;一般而言是面向过程编程和面向对象编程。面向过程编程&#…...

【vue+el-table】表格操作列宽度跟随按钮个数自适应, 方法封装全局使用

效果图 以上图片分别代表不同用户权限下所能看到的按钮个数, 操作列宽度也会自适应宽度, 就不会一直处于最大宽度, 导致其他权限用户看到的页面出现大量留白问题. 目录 解决方法解决过程中可能出现的问题width赋值时为什么不放update()中btnDom为什么不能直接调用forEach为…...

OpenAI发布全新o1 AI模型具备推理能力

&#x1f989; AI新闻 &#x1f680; OpenAI发布全新o1 AI模型具备推理能力 摘要&#xff1a;OpenAI推出新AI模型o1&#xff0c;具备推理能力&#xff0c;旨在比人类更快地解决复杂问题。o1与o1-mini版本同时发布&#xff0c;前者训练成本较高&#xff0c;但在编程和多步骤问…...

如何在本地部署大语言模型

近年来&#xff0c;随着大语言模型&#xff08;如GPT、BERT等&#xff09;的迅速发展&#xff0c;越来越多的开发者和研究人员希望在本地环境中部署这些强大的模型&#xff0c;以便用于特定的应用场景或进行个性化的研究。本文将详细介绍如何在本地部署大语言模型&#xff0c;涵…...

秒懂:环境变量

前言 1.Linux当中70%以上的命令程序都是用C语言写的 2.执行命令程序和运行自己写的程序没有任何区别 3.自己程序运行必须要带路径&#xff08;绝对/相对都可&#xff09; 4. 系统指令可带可不带&#xff08;带不要瞎带&#xff09; 变量具有全局特性是…...

使用 @Param 注解标注映射关系

目录 1. 场景描述 2. SQL语句 3. 方法定义 4. Param注解的使用 5. 总结 在开发过程中&#xff0c;我们经常需要在Java应用程序中执行数据库操作&#xff0c;尤其是更新操作。在Spring Data JPA框架中&#xff0c;我们可以使用原生SQL语句来执行这些操作&#xff0c;并通过…...

Java学习中在打印对象时忘记调用 .toString() 方法或者没有重写 toString() 方法怎么办?

在 Java 编程中&#xff0c;toString() 方法对于调试、日志记录以及打印对象信息至关重要。然而&#xff0c;许多初学者在打印对象时可能会忘记调用 .toString() 方法&#xff0c;或者在自定义类中没有重写 toString() 方法&#xff0c;这可能导致输出结果不符合预期。 一、Ja…...

如何评估一个RAG(检索增强生成)系统-上篇

最近项目中需要评估业务部门搭建的RAG助手的效果好坏&#xff0c;看了一下目前业界一些评测的方法。目前分为两大类&#xff0c;基于传统的规则、机器学习的评测方法&#xff0c;基于大模型的评测方法。在这里做一些记录&#xff0c;上篇主要做评测方法的记录&#xff0c;下篇会…...

rust解说

Rust 是一种开源的系统编程语言&#xff0c;由 Mozilla 研究院开发&#xff0c;旨在提供高性能、内存安全且并发性良好的编程体验。 Rust 于 2010 年由 Graydon Hoare 开始设计&#xff0c;并在 2015 年发布了第一个稳定版本。 Rust 的设计目标是解决 C 等传统系统编程语言在…...

Elasticsearch 开放 inference API 为 Hugging Face 添加了原生分块支持

作者&#xff1a;来自 Elastic Max Hniebergall 借助 Elasticsearch 开放推理 API&#xff0c;你可以使用 Hugging Face 的推理端点&#xff08;Inference Endpoints&#xff09;在 Elasticsearch 之外执行推理。这样你就可以使用 Hugging Face 的可扩展基础架构&#xff0c;包…...

Jenkins部署若依项目

一、配置环境 机器 jenkins机器 用途&#xff1a;自动化部署前端后端&#xff0c;前后端自动化构建需要配置发送SSH的秘钥和公钥&#xff0c;同时jenkins要有nodejs工具来进行前端打包&#xff0c;maven工具进行后端的打包。 gitlab机器 用途&#xff1a;远程代码仓库拉取和…...

ELK笔记

要搞成这样就需要钱来买服务器 开发人员一般不会给服务器权限&#xff0c;不能到服务器上直接看日志&#xff0c;所以通过ELK看日志。不让开发登录服务器。即使你查出来是开发的问题&#xff0c;费时间&#xff0c;而且影响了业务了&#xff0c;就是运维的问题 开发也不能登录…...

计算机网络 --- 计算机网络的分类

一、计算机网络分类 1.1 按分布范围分类 举例&#xff1a;广域网&#xff08;WAN&#xff09;、局域网&#xff08;LAN&#xff09; 举例&#xff1a;个域网&#xff08;PAN&#xff09; 1.2 按传输技术分类 广播式网络――当一台计算机发送数据分组时&#xff0c;广播范围…...

三维动画|创意无限,让品牌传播更精彩!

随着三维动画技术的不断成熟&#xff0c;三维动画宣传片能够很好地宣传品牌、推广产品&#xff0c;因而慢慢地受到不少企业的青睐&#xff0c;成为品牌最常用的一种宣传方式。 三维动画宣传片作为艺术感极高的宣传视频有强烈的节奏感&#xff0c;而且具有风趣、易懂等特点&…...

欧零导航系统正式版,功能强大,可直接运营

欧零导航系统正式版&#xff0c;带广告位/导航分类/可直接运营 本系统采用PHPMySQL技术开发 拥有独立的安装和后台系统 后台采用BootstripMDUI框架 前台使用响应式界面&#xff0c;自适应各种屏幕 代码免费下载&#xff1a;百度网盘...

了解变压器耦合电压开关 D类放大器

在本文中&#xff0c;我们将讨论另一种 D 类配置&#xff1a;变压器耦合电压切换 (TCVS) 放大器。TCVS 放大器的原理图如图 1 所示。 变压器耦合电压开关 D 类放大器的示意图。 图 1.变压器耦合电压开关 D 类放大器。 在本文中&#xff0c;我们将探索该放大器的工作原理&…...

openssh移植:精致的脚本版

前置文章&#xff1a; busybox移植&#xff1a;全能脚本版-CSDN博客 zlib交叉编译-CSDN博客 openssl移植:精致的脚本版-CSDN博客 源码下载 官网&#xff1a;http://www.openssh.com/ 下载了一个很新的版本 ftp://mirrors.sonic.net/pub/OpenBSD/OpenSSH/portable/openss…...

3C电子胶黏剂在手机制造方面有哪些关键的应用

3C电子胶黏剂在手机制造方面有哪些关键的应用 3C电子胶黏剂在手机制造中扮演着至关重要的角色&#xff0c;其应用广泛且细致&#xff0c;覆盖了手机内部组件的多个层面&#xff0c;确保了设备的可靠性和性能。以下是电子胶在手机制造中的关键应用&#xff1a; 手机主板用胶&…...

Oracle数据库中的动态SQL(Dynamic SQL)

Oracle数据库中的动态SQL是一种在运行时构建和执行SQL语句的技术。与传统的静态SQL&#xff08;在编写程序时SQL语句就已经确定&#xff09;不同&#xff0c;动态SQL允许开发者在程序执行过程中根据不同的条件或用户输入来构建SQL语句。这使得动态SQL在处理复杂查询、存储过程中…...

Python判断两张图片的相似度

在Python中&#xff0c;判断两张以numpy的ndarray格式存储的图片的相似度&#xff0c;通常可以通过多种方法来实现&#xff0c;包括但不限于直方图比较、像素差比较、结构相似性指数&#xff08;SSIM&#xff09;、特征匹配等。以下是一些常见方法的简要介绍和示例代码。 1. 像…...

MySQL高级功能-窗口函数

背景 最近遇到需求&#xff0c;需要对数据进行分组排序并获取每组数据的前三名。 一般涉及到分组&#xff0c;第一时间就是想到使用group by对数据进行分组&#xff0c;但这样分组&#xff0c;到最后其实只能获取到每组数据中的一条记录。 在需要获取每组里面的多条记录的时候…...

9.12总结

今天学了树状dp和tarjan 树状dp 树状dp&#xff0c;是一种在树形数据结构上应用的动态规划算法。动态规划&#xff08;DP&#xff09;通常用于解决最优化问题&#xff0c;通过将问题分解为相对简单的子问题来求解。在树形结构中&#xff0c;由于树具有递归和子结构的特性&…...

小众创新组合!LightGBM+BO-Transformer-LSTM多变量回归交通流量预测(Matlab)

小众创新组合&#xff01;LightGBMBO-Transformer-LSTM多变量回归交通流量预测(Matlab) 目录 小众创新组合&#xff01;LightGBMBO-Transformer-LSTM多变量回归交通流量预测(Matlab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现LightGBMBO-Transformer-L…...

《CSS新世界》书评

《CSS新世界》是由张鑫旭所著&#xff0c;人民邮电出版社在2021年8月10日出版的一本专门讲解CSS3及其之后版本新特性的进阶读物。这本书是“CSS世界三部曲”中的最后一部&#xff0c;全书近600页&#xff0c;内容丰富&#xff0c;涵盖了CSS的全局知识、已有属性的增强、新布局方…...

python 实现euler modified变形欧拉法算法

euler modified变形欧拉法算法介绍 Euler Modified&#xff08;改进&#xff09;变形欧拉法算法&#xff0c;也被称为欧拉修改法或修正欧拉法&#xff08;Euler Modified Method&#xff09;&#xff0c;是一种用于数值求解微分方程的改进方法。这种方法在传统欧拉法的基础上进…...

strcpy 函数及其缺点

目录 一、概念 二、strcpy 函数有什么缺点 1. 缺乏边界检查 2. 容易引发未定义行为 3. 不适合动态和未知长度的字符串操作 4. 替代方案的可用性 5. 效率问题 一、概念 strcpy 是 C 语言中的一个标准库函数&#xff0c;用于将源字符串复制到目标字符串中。它定义在 <…...

区块链-P2P(八)

前言 P2P网络&#xff08;Peer-to-Peer Network&#xff09;是一种点对点的网络结构&#xff0c;它没有中心化的服务器或者管理者&#xff0c;所有节点都是平等的。在P2P网络中&#xff0c;每个节点都可以既是客户端也是服务端&#xff0c;这种网络结构的优点是去中心化、可扩展…...

数据库管理的利器Navicat —— 全面测评与热门产品推荐

在数据库管理领域&#xff0c;Navicat无疑是一款深受欢迎的软件。作为一个强大的数据库管理和开发工具&#xff0c;它支持多种数据库类型&#xff0c;包括MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL等。本文将全面测评Navicat的核心功能&#xff0c;同时推荐几款…...

如何让Google收录我的网站?

其实仅仅只是收录&#xff0c;只要在GSC提交网址&#xff0c;等个两三天&#xff0c;一般就能收录&#xff0c;但收录是否会掉&#xff0c;这篇内容收录了是否有展现&#xff0c;排名&#xff0c;就是另外一个课题了&#xff0c;如果不收录&#xff0c;除了说明你的网站有问题&…...

03 Flask-添加配置信息

回顾之前学习的内容 02 Flask-快速上手 Flask 中最简单的web应用组成 1. 导入核心库 Flask from flask import Flask2. 实例化 web应用 注意&#xff1a;不要漏了 app Flask(__name__) 中的 __name__ 表示&#xff1a;是从当前的py文件实例化 app Flask(__name__)3. 创…...