【Python进阶】面向对象编程:用Python实现类与对象

1、面向对象编程概论

1.1 面向对象编程起源与发展

面向对象编程(Object-Oriented Programming, OOP)并非一夜之间凭空诞生的概念,它的历史可以追溯到20世纪60年代末期,当时Simula 67被认为是首个支持面向对象编程的编程语言。这一创新理念从早期的模块化编程中进化而来,解决了复杂系统的设计难题,允许程序员通过模拟现实世界中的实体(如汽车、动物、银行账户等)来构建更加结构化、易于维护和扩展的软件系统。

1.1.1 OOP的历史背景

设想回到编程初期,程序设计就像搭积木一样逐个拼接指令。随着系统日益庞大,管理众多相互作用的部分变得极为困难。这时,OOP应运而生,它倡导把数据结构和它们的操作封装在一起,形成“对象”,并通过类的形式定义这些对象的一般属性和行为。

1.1.2 OOP在现代编程中的地位与价值

在现代编程环境中,面向对象编程已成为主流的编程范式之一。诸如Java、C++、Python等众多流行语言都广泛支持OOP,并将其作为核心特性。OOP不仅提高了代码的复用性和可读性,还增强了软件系统的灵活性和可维护性。例如,在大型企业级应用开发中,OOP使得团队成员可以通过共享和扩展预先定义好的类来协同工作,降低沟通成本,提高整体效率。

1.2 面向对象的核心思想与特性

1.2.1 封装(Encapsulation)

封装就像是给程序中的数据穿上一层保护壳,隐藏内部实现细节,只对外暴露必要的操作接口。通过封装,可以确保数据的安全性,防止意外修改,同时简化外部对类内部结构的理解。比如,我们可以创建一个BankAccount类,其中封装了存款余额及其相关的存取款操作,外部只知道如何使用deposit()和withdraw()方法,而无需知道账户余额是如何存储和更新的。

class BankAccount:def __init__(self, initial_balance=0):self.__balance = initial_balance  # 私有变量封装真实余额def deposit(self, amount):self.__balance += amountdef withdraw(self, amount):if amount <= self.__balance:self.__balance -= amountelse:print("Insufficient balance!")def get_balance(self):return self.__balance

1.2.2 继承(Inheritance)

继承是一种层次结构模型,允许子类继承父类的属性和方法,从而避免重复编写相同的代码。例如,假设我们有一个Animal基类,Dog和Cat类就可以从Animal继承并扩展自己的特性。

class Animal:def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError("Subclass must implement this method")class Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"

1.2.3 多态(Polymorphism)

多态意味着同一个消息可以根据接收对象的不同产生不同的行为。在Python中,多态主要体现在方法重写(Override)和接口约定上。通过多态,调用方无需关心对象的具体类型,只需知道对象实现了某个接口或方法即可。例如,Animal类的speak()方法在Dog和Cat子类中表现出截然不同的行为。

def make_animal_speak(animal):animal.speak()dog = Dog("Rex")
cat = Cat("Whiskers")
make_animal_speak(dog)  # 输出 "Woof!"
make_animal_speak(cat)  # 输出 "Meow!"

通过这样的实例,我们可以生动形象地展示面向对象编程的核心概念,让技术爱好者和技术从业者既能理解OOP背后的思想,又能掌握如何在Python中实际运用这些概念。

2、Python语言与面向对象编程

2.1 Python对OOP的支持

2.1.1 Python中类的定义与使用

在Python中,面向对象编程得到了强有力的支持,类的定义简洁明了。类是现实世界实体的抽象模型,它定义了一组共同特征(属性)和行为(方法)。下面是一个简单的Python类定义示例:

class Animal:def __init__(self, name, species):self.name = nameself.species = speciesdef speak(self):raise NotImplementedError("Subclasses should implement this method")# 使用类创建对象(实例化)
my_pet = Animal("Fido", "Dog")
print(my_pet.name)  # 输出 "Fido"

在这里,Animal类包含了两个属性——name和species,以及一个抽象方法speak。通过__init__构造方法初始化对象时,我们可以赋予对象特定的属性值。

2.1.2 Python中的类属性与实例属性

类属性是属于整个类而非类的任意一个实例的属性。所有实例共享同一份类属性副本,修改类属性会影响到所有实例。

class Animal:total_count = 0  # 类属性,记录动物总数def __init__(self, name, species):self.name = nameself.species = speciesAnimal.total_count += 1class Dog(Animal):passdog1 = Dog("Buddy", "Golden Retriever")
dog2 = Dog("Max", "German Shepherd")print(Dog.total_count)  # 输出 "2"

实例属性则专属于每个实例,每个实例有自己的副本,互不影响。

2.2 创建与使用类(Class)与对象(Instance)

2.2.1 定义Python类的基本结构

一个典型的Python类包含属性声明、方法定义和其他类级别的声明。类名通常采用驼峰命名法,并通过class关键字定义。

class MyClass:def __init__(self, some_attribute):self.some_attribute = some_attributedef some_method(self):return f"This is {self.some_attribute}"

2.2.2 构造方法(init)与初始化对象

__init__是特殊的实例方法,每当创建类的新实例时都会自动调用。它负责初始化实例的状态。

class Person:def __init__(self, first_name, last_name):self.first_name = first_nameself.last_name = last_namejohn_doe = Person("John", "Doe")

2.2.3 访问控制与封装实践

在Python中,虽然没有严格的访问修饰符(如Java或C++中的public、private和protected),但通过命名约定实现类似的效果。

● 公有(Public):无前导下划线(_)的属性和方法默认视为公共的,可以从类外部自由访问和修改。
● 私有(Private):双下划线前缀(__)的属性和方法被视为私有,Python会重命名这些属性以阻止直接外部访问,但这并不是绝对意义上的私有,而是提供了某种程度的封装。

class Car:def __init__(self, color):self.__color = color  # 私有属性,外部无法直接访问def get_color(self):return self.__color

● 保护(Protected):单下划线前缀(_)一般用于表示内部实现或不鼓励外部直接使用的属性或方法,这是一种约定而非强制。

2.2.4 实例方法与类方法的区别及应用

● 实例方法:依赖于实例调用,第一个参数通常是self,代表调用该方法的对象本身。

class Circle:def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * (self.radius ** 2)circle = Circle(5)
print(circle.area())  # 输出圆的面积

● 类方法:使用@classmethod装饰器标记,第一个参数为cls,代表的是类而不是实例。

class Pizza:crust_size_default = 'medium'@classmethoddef set_default_crust_size(cls, size):cls.crust_size_default = sizedef __init__(self, toppings, crust_size=None):self.toppings = toppingsself.crust_size = crust_size or Pizza.crust_size_defaultPizza.set_default_crust_size('large')  # 设置默认饼皮尺寸为大号

● 静态方法:使用@staticmethod装饰器标记,不接受self或cls参数,仅仅是一个与类或实例无关的独立函数。

class MathUtils:@staticmethoddef add_numbers(a, b):return a + bresult = MathUtils.add_numbers(3, 5)
print(result)  # 输出 8

通过这些实例,我们展示了如何在Python中定义类、创建对象以及如何利用类属性、实例属性、实例方法、类方法和静态方法来实现面向对象编程的各种特性。

3、Python中的类方法与静态方法

3.1 类方法(@classmethod)

3.1.1 类方法的定义与调用

在Python中,类方法是一种特殊的方法,它与普通实例方法的主要区别在于,类方法的第一个参数不是实例引用self,而是类引用cls。这意味着当你调用类方法时,它是相对于类而不是实例调用的。类方法常用于处理与类有关而非特定实例的行为。

class MyClass:@classmethoddef from_string(cls, string_value):# 这里cls代表MyClass类自身return cls(string_value)def __init__(self, value):self.value = value# 创建一个类方法的实例
instance = MyClass.from_string("Hello, World!")
print(instance.value)  # 输出 "Hello, World!"

在这个例子中,from_string类方法接受一个字符串并返回类的一个新实例。这种方式很常见于工厂模式,允许用户通过传递预定义参数直接创建类的实例。

3.1.2 类方法在实际编程中的应用场景

类方法在很多实际场合下发挥着重要作用。比如,当需要定义一个根据某种配置或默认值创建对象的方法时,类方法就显得尤为合适。以下是一个使用类方法获取数据库连接的示例:

import sqlite3class DatabaseConnection:_default_database = "default.db"@classmethoddef get_connection(cls, db_name=None):db_name = db_name or cls._default_databaseconnection = sqlite3.connect(db_name)return connection# 获取默认数据库连接
conn = DatabaseConnection.get_connection()

3.2 静态方法(@staticmethod)

3.2.1 静态方法的功能与特点

静态方法是类方法的一种特殊情况,它既不需要self也不需要cls作为第一个参数。静态方法完全独立于类和实例,它们只是被类所包含的常规函数,仅因为逻辑上的关联而归入类的定义内。

class Utilities:@staticmethoddef convert_to_uppercase(input_str):return input_str.upper()# 使用静态方法
text = "hello, world!"
uppercase_text = Utilities.convert_to_uppercase(text)
print(uppercase_text)  # 输出 "HELLO, WORLD!"

3.2.2 使用静态方法的实际案例分析

静态方法在编程中主要用于实现一些与类或实例无关的辅助功能。例如,在一个处理日期的类中,可能有一个计算两个日期之间天数差的静态方法,因为它并不依赖于类或实例状态,仅仅是数学计算。

from datetime import datetimeclass DateUtils:@staticmethoddef days_between(date1, date2):delta = date2 - date1return delta.daysstart_date = datetime(2022, 1, 1)
end_date = datetime(2022, 12, 31)
days_in_year = DateUtils.days_between(start_date, end_date)
print(days_in_year)  # 输出 364 或 365(非闰年与闰年的区别)

通过这些示例,我们可以清楚地看到Python中的类方法和静态方法如何丰富了面向对象编程的手段,使开发者能够更好地组织代码,提高代码的可读性和可维护性。

4、面向对象编程中的继承

4.1 单继承与多继承

4.1.1 基类与子类的关系

在面向对象编程中,基类(也称为超类或父类)是派生其他类的基础,而子类则是从基类继承特性和行为的类。子类可以扩展基类的功能,也可以根据需要覆写或添加新的方法和属性。在Python中,继承关系由冒号(:)和基类列表来表达。

class Animal:  # 基类(父类)def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError("Each animal needs to define how they speak.")class Dog(Animal):  # 子类(派生类)def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"

4.1.2 Python中继承的语法与规则

Python支持单继承和多继承。单继承指一个类只能从一个基类继承,如下所示:

class SingleChild(SingleParent):# ...

而多继承允许多个基类合并它们的特性和方法到一个子类中:

class MultiChild(MultiParent1, MultiParent2, MultiParent3):# ...

4.1.3 方法重写(Override)与super()关键字的使用

在子类中,有时需要更改基类的方法实现以适应子类的特定需求,这就是方法重写(Override)。例如,上面的Dog和Cat类都重写了Animal的speak()方法。

为了在子类中调用父类已被重写的方法,Python提供了super()关键字。super()可以让我们更容易地调用父类的方法,即使在多继承情况下也能正确处理方法解析顺序(MRO)。

class EnhancedDog(Dog):def additional_behavior(self):super().speak()  # 调用Dog类(父类)的speak()方法print("I can also roll over!")e_dog = EnhancedDog("Buddy")
e_dog.additional_behavior()  # 输出 "Woof!" 和 "I can also roll over!"

4.2 MRO(Method Resolution Order)与多继承查找规则

4.2.1 Python中的C3线性化算法

Python使用C3线性化算法来确定类的方法解析顺序(MRO),保证了继承体系中方法调用的唯一性和一致性。MRO决定了在多重继承的情况下,当调用一个未在子类中定义的方法时,Python应该按照怎样的顺序在各个基类中查找。

4.2.2 查找并理解MRO问题的实际例子

考虑一个多继承的情况,MultiChild继承自A、B和C三个类,如果这三个类都定义了同名方法,则Python会遵循MRO顺序查找。

class A:def method(self):print("From A")class B(A):def method(self):print("From B")class C(A):def method(self):print("From C")class MultiChild(B, C):passchild = MultiChild()
child.method()  # 输出 "From B" 因为Python遵循MRO:MultiChild -> B -> C -> A

通过查看MultiChild.mro()可以明确看到Python是如何决定方法调用顺序的。这一章节深入剖析了Python中继承机制的关键概念,包括如何利用继承进行代码复用,解决实际编程问题,以及如何理解和处理复杂的继承结构中的方法调用问题,帮助读者在实际开发中更加自如地运用面向对象编程的继承特性。

5、面向对象编程中的高级特性与设计模式

5.1 属性装饰器与描述符

5.1.1 @property与.setter的使用

在Python中,属性装饰器是对对象属性访问的一种包装,允许对读取或设置属性的行为进行更精细的控制。@property用于定义只读属性,实际上是将方法调用伪装成属性访问。

class Person:def __init__(self, name):self._name = name@propertydef name(self):return self._name.capitalize()@name.setterdef name(self, new_name):if isinstance(new_name, str) and len(new_name) > 0:self._name = new_nameelse:raise ValueError("Invalid name provided.")p = Person("john")
print(p.name)  # 输出 "John"
p.name = "Jane"  # 正确设置姓名
print(p.name)  # 输出 "Jane"
p.name = ""  # 抛出 ValueError 异常

5.1.2 自定义描述符实现更复杂的数据绑定

描述符是实现了__get__()、set()和__delete__()方法的类,它们可以直接绑定到类属性上,提供更强的数据管理能力。当描述符类的实例作为类属性时,Python会自动调用相应的方法处理属性的获取、设置和删除操作。

class ManagedAttribute:def __init__(self, default_value):self._value = default_valuedef __get__(self, instance, owner):return self._valuedef __set__(self, instance, value):if not isinstance(value, int):raise TypeError("Value must be an integer.")self._value = valuedef __delete__(self, instance):self._value = Noneclass MyClass:managed_int = ManagedAttribute(0)obj = MyClass()
print(obj.managed_int)  # 输出 0
obj.managed_int = 5  # 正确设置整数值
print(obj.managed_int)  # 输出 5
obj.managed_int = "not an int"  # 抛出 TypeError 异常

5.2 设计模式在Python OOP中的应用

5.2.1 工厂模式

工厂模式提供了一个创建对象的接口,而不暴露创建逻辑。在Python中,工厂函数或类方法可用于创建对象实例。

class VehicleFactory:@staticmethoddef create_vehicle(type):if type == 'car':return Car()elif type == 'truck':return Truck()else:raise ValueError(f"Unsupported vehicle type: {type}")class Car:def __init__(self):print("Creating a car...")class Truck:def __init__(self):print("Creating a truck...")vehicle = VehicleFactory.create_vehicle('car')  # 输出 "Creating a car..."

5.2.2 单例模式

单例模式保证一个类只有一个实例,并提供全局访问点。在Python中,可以通过模块级别变量、元类或其他机制实现单例。

class SingletonMeta(type):_instances = {}def __call__(cls, *args, **kwargs):if cls not in cls._instances:cls._instances[cls] = super().__call__(*args, **kwargs)return cls._instances[cls]class Singleton(metaclass=SingletonMeta):def __init__(self):print("Creating the singleton instance...")singleton1 = Singleton()  # 输出 "Creating the singleton instance..."
singleton2 = Singleton()  # 不再输出,返回已存在的单例实例

5.2.3 观察者模式

观察者模式定义了对象之间的一对多依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。在Python中,可以使用内置的collections模块中的Observer和Observable接口实现,或者自定义事件触发机制。

import collectionsclass Observable:def __init__(self):self._observers = collections.defaultdict(list)def register_observer(self, event_type, observer):self._observers[event_type].append(observer)def remove_observer(self, event_type, observer):self._observers[event_type].remove(observer)def notify_observers(self, event_type, *args, **kwargs):for observer in self._observers[event_type]:observer(*args, **kwargs)class Observer:def update(self, observable, event_data):print(f"Observer received data: {event_data}")observable = Observable()
observer = Observer()
observable.register_observer('event', observer)
observable.notify_observers('event', "Data update")  # 输出 "Observer received data: Data update"

通过以上章节的探讨,我们可以看到Python面向对象编程不仅支持基本的类、对象和继承机制,还提供了丰富的高级特性如属性装饰器、描述符以及对设计模式的良好支持。

6、实战项目演示

6.1 从简单示例到复杂应用场景

6.1.1 创造一个简单的游戏实体类

想象一下,我们要创建一个简单的角色扮演游戏(RPG),其中有一个游戏角色类 GameCharacter。这个类体现了面向对象编程的核心原则,包括封装、继承和多态。

class GameCharacter:def __init__(self, name, health, attack_power):self.name = nameself._health = health  # 使用下划线表示私有属性,但仍可通过getter和setter访问self.attack_power = attack_power@propertydef health(self):return self._health@health.setterdef health(self, value):if value < 0:self._health = 0else:self._health = valuedef attack(self, target):damage_dealt = self.attack_powertarget.take_damage(damage_dealt)def take_damage(self, damage):self.health -= damageif self.health <= 0:self.die()def die(self):print(f"{self.name} has died!")class Warrior(GameCharacter):def __init__(self, name, health=100, attack_power=50):super().__init__(name, health, attack_power)def charge_attack(self, target):bonus_damage = self.attack_power * 1.5self.attack(target, bonus_damage)warrior1 = Warrior("Grimbold")
warrior2 = Warrior("Eirik")warrior1.attack(warrior2)
print(warrior2.health)  # 输出受伤后的生命值

在这个例子中,GameCharacter类是一个基本的游戏实体,包含了角色的基本属性和方法。Warrior类继承自GameCharacter并添加了额外的方法charge_attack,展示了继承和多态的运用。

6.1.2 设计一个基于继承的图形界面组件库

在GUI编程领域,面向对象编程尤为重要。下面是一个使用面向对象思想设计的简单GUI组件库的示例,这里我们将创建一个基类Widget和两个继承自Widget的子类Button和Label。

class Widget:def __init__(self, position, size):self.position = positionself.size = sizeself.is_visible = Truedef draw(self):if self.is_visible:print(f"Drawing widget at position {self.position} with size {self.size}")def show(self):self.is_visible = Truedef hide(self):self.is_visible = Falseclass Button(Widget):def __init__(self, position, size, text=""):super().__init__(position, size)self.text = textdef on_click(self):print(f"Button '{self.text}' clicked.")class Label(Widget):def __init__(self, position, size, text=""):super().__init__(position, size)self.text = textdef draw(self):super().draw()print(f"Label text: {self.text}")# 应用示例
button = Button((10, 10), (50, 20), "Click me!")
label = Label((60, 10), (100, 20), "Hello, World!")button.draw()
label.draw()
button.on_click()

在此案例中,Widget作为基类,定义了所有组件共有的属性和方法,而Button和Label作为子类,分别增加了按钮点击事件和显示文本标签的功能。这不仅体现了封装和继承,而且在实际的图形界面编程中,多态性也是必不可少的,如事件处理函数通常会对不同类型的组件产生不同的响应。通过这样的设计,我们可以轻松构建和扩展UI组件库,服务于各类应用程序。

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

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

相关文章

【Linux】自动化构建工具makefile

目录 背景 makefile简单编写 .PHONY makefile中常用选项 makefile的自动推导 背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力 ​ ◉ 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…

Scrapy 项目部署Scrapyd

什么是Scrapyd Scrapyd 是一个用来管理和运行 Scrapy 爬虫的服务。它允许用户将 Scrapy 项目部署到服务器上&#xff0c;然后通过一个简单的 API 来启动、停止和监控爬虫的运行。Scrapyd 可以帮助简化爬虫的部署过程&#xff0c;使得用户不必手动在服务器上运行爬虫&#xff0c…

【测试】JMeter从入门到进阶

本文参考 Jmeter自动化测试工具从入门到进阶6小时搞定&#xff0c;适合手工测试同学学习_哔哩哔哩_bilibili JMeter介绍 JMeter 是 Apache 组织使用 Java 开发的一款测试工具&#xff1a; 1、可以用于对服务器、网络或对象模拟巨大的负载 2、通过创建带有断言的脚本来验证程序…

9个最流行的文本转语音引擎【TTS 2024】

在快速发展的技术世界中&#xff0c;文本转语音 (TTS) 引擎正在取得显著进步。从增强各种应用程序中的用户体验到创建逼真且引起情感共鸣的语音输出&#xff0c;TTS 引擎正变得不可或缺。在这里&#xff0c;我们介绍了 2024 年为行业树立新标准的九款最佳 TTS 引擎。 NSDT工具推…

应用层协议(上)Http(URL、Cookie、Session)内含逻辑图解通俗易懂!

绪论​ “少年没有乌托邦 心向远方自明朗”&#xff0c;本章是应用层常用且重要的协议htttp&#xff0c;没看过应用层建议一定先看那一篇后再看本章才能更好的去从上到下的理解应用层。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 1.Http协…

Mac移动硬盘选什么格式最好 Mac怎么用ntfs移动硬盘

在使用Mac电脑的过程中&#xff0c;很多用户可能有需要扩展存储空间的需求。选择合适的移动硬盘格式对于数据传输的效率和兼容性至关重要。本文将详细介绍Mac移动硬盘选什么格式好&#xff0c;以及Mac怎么用ntfs移动硬盘&#xff0c;帮助用户优化Mac的使用体验。 一、Mac移动硬…

悬浮翻译工具有哪些?工作学习必备的5款悬浮翻译工具

当我们身处异国他乡&#xff0c;或是工作中遇到多语种交流的需求时&#xff0c;语言障碍往往会成为一道难以逾越的高墙。 不过&#xff0c;在这个充满创新的时代里&#xff0c;技术已经为我们准备好了答案——屏幕翻译器app。它们不仅能够即时翻译屏幕上的文字&#xff0c;还能…

电脑回收站清空了怎么恢复?

在日常使用电脑的过程中&#xff0c;不小心清空回收站导致重要文件丢失的情况时有发生。面对这种情况&#xff0c;我们不必过于慌张&#xff0c;因为有多种方法可以尝试恢复被清空的文件。本文将为您详细介绍几种有效的恢复方法&#xff0c;帮助您找回宝贵的文件。 方法一&…

芯片后端之 PT 使用 report_timing 产生报告 之 -nets 选项

今天,我们再学习一点点 后仿真相关技能。 那就是,了解 report_timing 中的 -nets 选项 。 如果我们仅仅使用如下命令,执行后会发现: pt_shell> report_timing -from FF1/CK -to FF2/d -delay_type max 我们使用命令 report_timing 报出的如上路径延时信息,仅仅显示…

Maven的一些相关知识【重修】《包括私服搭建!》

mvnrepository.com Maven 下载jar包的位置&#xff01; 【该部分有教程】 这是什么nb代码投稿视频-这是什么nb代码视频分享-哔哩哔哩视频 MAVEN 的私服搭建&#xff1a; https://zhuanlan.zhihu.com/p/520107316 2、maven私服搭建及应用&#xff08;下&#xff09;_哔哩…

高级java每日一道面试题-2024年8月25日-前端篇(Vue篇)-v-show和v-if有什么区别?

如果有遗漏,评论区告诉我进行补充 面试官: v-show和v-if有什么区别? 我回答: 在Vue.js中&#xff0c;v-if和v-show都是用于根据条件控制元素显示或隐藏的指令&#xff0c;但它们之间存在几个关键的区别。以下是这两个指令的主要区别&#xff1a; 1. 渲染方式 v-if&#x…

R7RS标准之重要特性及用法实例(三十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

微信小程序如何存储值

微信小程序存储值的方法主要包括本地存储和云存储两种方式。以下是这两种方式的详细介绍&#xff1a; 一、本地存储 本地存储是在用户的设备上保存数据的技术&#xff0c;使得数据在小程序关闭后仍能保留。微信小程序提供了多种API来实现本地存储功能。 1. 缓存数据 方式&a…

公考面试笔记_社会现象类1

目录 1.线上审批2.社交恐惧3.食品安全4.安全生产5.残疾人6.明星睡觉直播7.不文明现象8.胡言乱语的专家9. 缝缝补补又三年 老夏说面试自学笔记整理&#xff0c;自学用~ 1.线上审批 政府鼓励推广线上审批形式&#xff0c;利用线上及自助柜员机等帮助群众办理审批。但有单位强制…

frameworks 之InputReader

frameworks 之InputReader InputManagerService 初始化InputManagerService 启动InputReader 事件的读取设备节点注册和监听设备输入事件的读取 InputReader 事件的处理设备的添加和删除处理触摸事件的处理数据的加工和分发 android 输入事件 主要分 2个流程 事件读取 和 事件…

python的jieba库中文分词词频统计和合并

可能在设置问题模板的时候需要分析已有问句&#xff0c;然后统计词频&#xff0c;根据词频设计问题模板

31套科技风PPT免费分享

目录 部分展示 部分展示 #PPT下载 「科技风模板」链接&#xff1a;https://pan.quark.cn/s/fb2f39a1d343 链接永久有效&#xff0c;点击这里下载&#xff0c;记得给个赞哦

Java生成一个5位的随机验证码(大小写字母和数字)

生成验证码 内容&#xff1a;可以是小写字母&#xff0c;也可以是大写字母&#xff0c;还可以是数字 规则&#xff1a;长度为5 内容中四位字母&#xff0c;一位数字 其中数字只有一位&#xff0c;但是可以出现在任意位置。 package test;impo…

QT error: expected ‘:‘ before ‘slots‘ public slots:

C:\Users\Administrator\Desktop\VideoHill\GikISearch\net.h:10: error: expected : before slots public slots: 先看看头文件里有没有加上引用包含#include <xxxx> 也就是一个引用包含都没有 没有就会报这个。至少一个。 加上后

【架构-24】XML和JSON

XML&#xff08;可扩展标记语言&#xff09;和JSON&#xff08;JavaScript对象表示法&#xff09;是两种常用的数据格式&#xff0c;用于在不同系统之间传输和交换数据。它们各有优点和缺点&#xff0c;适用于不同的场景。下面是对XML和JSON的简要介绍以及它们之间的对比。 XM…