Python 教程---面向对象编程

面向对象编程

  • 4.1 类和对象的概念
      • 类(Class)
      • 对象(Object)
      • 示例
      • 创建和使用类
  • 4.2 类成员
      • 实例成员
      • 类成员
      • 静态成员
      • 示例
  • 4.3 面向对象三要素
      • 封装(Encapsulation)
      • 继承(Inheritance)
      • 多态(Polymorphism)
  • 4.4 创建类
      • 类的定义
      • 构造函数 `__init__`
      • 创建类的实例
      • 访问属性和方法
      • 示例
  • 4.5 抽象类
      • 抽象方法
      • 使用`abc`模块
      • 示例
      • 注意
  • 4.6 访问限制
      • 名称修饰
      • 使用属性装饰器
      • 总结
  • 4.7 获取对象信息
      • `type()` 函数
      • `isinstance()` 函数
      • `dir()` 函数
      • `getattr()`, `setattr()` 和 `hasattr()` 函数
      • `__dict__` 属性
      • `inspect` 模块
      • 示例

4.1 类和对象的概念

在Python中,面向对象编程(OOP)是一种编程范式,它使用“对象”来表示数据和操作。对象是Python中的基本构建块,几乎所有的东西都是对象。对象是具有属性和行为的实体,而类则是创建这些对象的蓝图或模板。

类(Class)

类是创建对象的模板。它定义了一组属性(称为成员变量)和方法(称为成员函数)。类提供了一种将数据(属性)和与数据相关的功能(方法)捆绑在一起的方式。这有助于组织代码并使其更易于理解和维护。

对象(Object)

对象是类的实例。当你创建一个类时,你定义了一组属性和方法,但它们只存在于理论中。当你创建一个对象时,你实际上是在使用类作为模板来创建一个具体的实体,这个实体具有类定义的属性和方法。

示例

让我们以“汽车”为例来解释类和对象的概念。

  • :汽车可以是一个类。这个类定义了汽车的所有共同特征,比如颜色、品牌、最大速度等(属性),以及启动、停止、加速等(方法)。
  • 对象:具体的一辆汽车,比如一辆红色的特斯拉,就是一个对象。这辆特斯拉具有汽车类定义的所有属性和方法,但它有自己特定的值,比如它的颜色是红色,品牌是特斯拉。

创建和使用类

在Python中,你可以使用class关键字来创建一个类。一旦定义了类,就可以使用该类来创建对象。

# 定义一个汽车类
class Car:def __init__(self, color, brand):self.color = colorself.brand = branddef start(self):print("汽车启动了")def stop(self):print("汽车停止了")
# 创建一个汽车对象
my_car = Car("红色", "特斯拉")
# 访问对象的属性
print(my_car.color)  # 输出: 红色
print(my_car.brand)  # 输出: 特斯拉
# 调用对象的方法
my_car.start()  # 输出: 汽车启动了
my_car.stop()   # 输出: 汽车停止了

在这个例子中,我们定义了一个名为Car的类,它有两个属性(colorbrand)和两个方法(startstop)。然后我们创建了一个Car类的实例my_car,并设置了它的颜色为“红色”和品牌为“特斯拉”。最后,我们访问了my_car的属性和调用了它的方法。


4.2 类成员

在Python中,类的成员主要包括属性和方法。属性用于存储数据,而方法则用于定义可执行的操作。类成员可以分为几种不同的类型,包括实例成员、类成员和静态成员。

实例成员

实例成员是属于类的每个对象的成员。每个对象都有其自己的实例成员副本。实例成员通常包括实例变量(属性)和实例方法(函数)。

  • 实例变量:这些变量是属于类的每个对象的变量。它们在类的构造函数__init__中初始化,并通过self关键字访问。
  • 实例方法:这些方法是属于类的每个对象的方法。它们以self作为第一个参数,self代表类的当前实例。
class Car:def __init__(self, make, model):self.make = make  # 实例变量self.model = model  # 实例变量def display(self):  # 实例方法print(f"汽车制造商:{self.make}, 型号:{self.model}")

类成员

类成员是属于类本身而不是类的任何一个对象的成员。它们通常用于存储与类相关的数据或方法,这些数据或方法在类的所有实例之间共享。

  • 类变量:这些变量是属于类的变量,它们在类的所有实例之间共享。
  • 类方法:这些方法是属于类的方法,它们以cls作为第一个参数,cls代表类本身。
class Car:num_wheels = 4  # 类变量def __init__(self, make, model):self.make = makeself.model = model@classmethoddef get_num_wheels(cls):  # 类方法return cls.num_wheels

静态成员

静态成员是不依赖于类和对象的成员。它们通常用于创建与类相关的 utility 函数或常量。

  • 静态方法:这些方法是不依赖于类和对象的普通函数,它们可以通过类或对象来调用。
class Car:@staticmethoddef is_valid_make(make):# 假设这是一个检查制造商是否有效的静态方法return make in ['Toyota', 'Honda', 'Ford']

示例

下面是一个简单的示例,展示了如何使用实例成员、类成员和静态成员:

class Car:num_wheels = 4  # 类变量def __init__(self, make, model):self.make = make  # 实例变量self.model = model  # 实例变量def display(self):  # 实例方法print(f"汽车制造商:{self.make}, 型号:{self.model}")@classmethoddef get_num_wheels(cls):  # 类方法return cls.num_wheels@staticmethoddef is_valid_make(make):  # 静态方法return make in ['Toyota', 'Honda', 'Ford']
# 创建Car类的实例
my_car = Car('Toyota', 'Corolla')
# 调用实例方法
my_car.display()  # 输出: 汽车制造商:Toyota, 型号:Corolla
# 访问类变量
print(Car.num_wheels)  # 输出: 4
# 调用类方法
print(Car.get_num_wheels())  # 输出: 4
# 调用静态方法
print(Car.is_valid_make('Toyota'))  # 输出: True

在这个例子中,我们定义了一个Car类,它有一个类变量num_wheels,一个实例方法display,一个类方法get_num_wheels和一个静态方法is_valid_make。我们还创建了一个Car类的实例my_car,并演示了如何使用这些类成员。


4.3 面向对象三要素

面向对象编程(OOP)的三个核心概念是封装、继承和多态。这些概念是OOP的基础,它们一起提供了一种组织代码、重用代码和为代码提供灵活性的强大方式。

封装(Encapsulation)

封装是隐藏对象的实现细节并仅公开接口的过程。这意味着将数据(属性)和操作数据的方法(函数)捆绑在一起,并限制对数据的直接访问。封装通过访问修饰符(如Python中的publicprivateprotected)实现,尽管Python没有这些修饰符的正式语法,但通过约定来实现。
在Python中,以下划线开头的成员(如_variable__method)被认为是非公开的(尽管它们仍然可以被访问)。这向其他开发者传达了一个信号,即这些成员是内部实现的,不应该直接访问。

class Car:def __init__(self, make, model):self._make = make  # 私有属性self._model = model  # 私有属性def get_make(self):  # 公共方法return self._makedef get_model(self):  # 公共方法return self._model

在上面的例子中,_make_model被认为是私有属性,而get_makeget_model是公共方法,用于访问这些属性。

继承(Inheritance)

继承是一种机制,允许我们定义一个类(子类)来继承另一个类(父类)的属性和方法。子类继承父类的所有属性和方法,并可以添加新的属性和方法或覆盖(重写)父类的方法。

class Vehicle:def __init__(self, brand):self.brand = branddef display_info(self):print(f"这是一辆{self.brand}汽车。")
class Car(Vehicle):def __init__(self, brand, model):super().__init__(brand)self.model = modeldef display_info(self):print(f"这是一辆{self.brand}{self.model}型号汽车。")

在这个例子中,Car类继承了Vehicle类,并添加了一个新的属性model和一个覆盖display_info方法的新方法。

多态(Polymorphism)

多态是指允许对象采用多种形式的能力。在面向对象编程中,这意味着可以通过一个通用的接口来调用不同的实现。多态通常通过继承和方法重写来实现。

class Animal:def speak(self):pass
class Dog(Animal):def speak(self):return "汪汪汪"
class Cat(Animal):def speak(self):return "喵喵喵"
# 多态示例
animals = [Dog(), Cat()]
for animal in animals:print(animal.speak())

在这个例子中,DogCat类都继承自Animal类,并重写了speak方法。当我们遍历animals列表并调用speak方法时,每个对象都会根据其类产生不同的行为,这就是多态的体现。
总结来说,封装、继承和多态是面向对象编程的三要素,它们共同构成了OOP的基础,并提供了编写可重用、可维护和灵活代码的工具。


4.4 创建类

在Python中,创建一个类是定义新对象类型的过程。类定义通常包括属性(也称为成员变量)和方法(也称为成员函数)。类提供了一个蓝图,用于创建具有相同属性和方法的对象。

类的定义

类使用class关键字来定义。类名通常首字母大写,以符合Python的命名约定。类定义后面跟着一个冒号,然后是一个缩进的代码块,包含类的属性和方法。

class MyClass:# 类的属性my_attribute = "这是一个类属性"def __init__(self, value):# 实例的属性self.my_instance_attribute = valuedef my_method(self):# 类的方法print("这是一个类的方法")

构造函数 __init__

__init__ 方法是一个特殊的方法,当创建类的新实例时,它会被自动调用。这个方法通常用于初始化对象的属性,为对象提供初始状态。
在上面的例子中,__init__ 方法接受一个参数 value,并将其赋值给实例属性 my_instance_attribute

创建类的实例

创建类的实例是通过调用类名并传递相应的参数来完成的。这将创建类的一个新对象。

# 创建 MyClass 的一个实例
my_instance = MyClass("这是一个实例属性")

访问属性和方法

一旦创建了类的实例,就可以使用点号(.)来访问其属性和方法。

# 访问实例属性
print(my_instance.my_instance_attribute)
# 调用实例方法
my_instance.my_method()

示例

下面是一个简单的类定义,它包含一个构造函数、一个实例方法和一个类属性:

class Car:# 类属性num_wheels = 4def __init__(self, make, model):# 实例属性self.make = makeself.model = modeldef display(self):# 实例方法print(f"汽车制造商:{self.make}, 型号:{self.model}")
# 创建 Car 类的实例
my_car = Car("Toyota", "Corolla")
# 访问实例属性
print(my_car.make)  # 输出: Toyota
print(my_car.model)  # 输出: Corolla
# 调用实例方法
my_car.display()  # 输出: 汽车制造商:Toyota, 型号:Corolla
# 访问类属性
print(Car.num_wheels)  # 输出: 4

在这个例子中,我们定义了一个Car类,它有一个类属性num_wheels,一个构造函数__init__,一个实例方法display。然后我们创建了一个Car类的实例my_car,并演示了如何使用它的属性和方法。


4.5 抽象类

在Python中,抽象类是一种不能被实例化的类,它只能作为其他类的基类。抽象类用于定义一组抽象方法,这些方法必须由子类实现。抽象类确保派生类具有特定的结构和行为,从而提供了一种标准化的方式来组织代码。

抽象方法

抽象方法是只有方法声明而没有实现的方法。在Python中,抽象方法是通过在方法定义中使用abstractmethod装饰器来指定的。抽象方法必须在子类中被重写(实现)。

使用abc模块

在Python中,要创建抽象类,需要导入abc模块(Abstract Base Classes模块)。abc模块提供了一个名为ABCMeta的元类和一个名为abstractmethod的装饰器,用于创建抽象类和抽象方法。

示例

下面是一个使用abc模块创建抽象类和抽象方法的示例:

from abc import ABC, abstractmethod
# 定义一个抽象类
class Shape(ABC):@abstractmethoddef area(self):pass@abstractmethoddef perimeter(self):pass
# 实现抽象类
class Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.heightdef perimeter(self):return 2 * (self.width + self.height)
# 创建 Rectangle 类的实例
rect = Rectangle(10, 20)
# 调用实例方法
print(rect.area())  # 输出: 200
print(rect.perimeter())  # 输出: 60

在这个例子中,我们定义了一个名为Shape的抽象类,它有两个抽象方法areaperimeter。然后我们定义了一个名为Rectangle的类,它继承自Shape并实现了这两个抽象方法。最后,我们创建了一个Rectangle类的实例rect,并调用了它的areaperimeter方法。

注意

抽象类不能被实例化,这意味着你不能直接创建Shape类的实例。如果你尝试这样做,将会得到一个错误:

abstract_shape = Shape()  # TypeError: Can't instantiate abstract class Shape with abstract methods area, perimeter

抽象类的目的在于定义接口,确保派生类遵循特定的协议。通过这种方式,抽象类提供了一种在面向对象设计中实现多态和接口标准化的强大工具。


4.6 访问限制

在Python中,虽然没有访问修饰符(如C++或Java中的publicprivateprotected)来严格限制属性的访问级别,但是有一些约定和技巧可以用来实现类似的效果。

名称修饰

Python使用名称修饰来模拟私有属性。任何以两个下划线开头的名称(如__my_private_attribute)会被“改名”,以避免子类中的命名冲突。这种改名实际上是将名称改编为_类名__名称的形式。虽然这种改名机制不直接提供访问限制,但它确实使得不小心访问或修改这些属性变得更加困难。

class MyClass:def __init__(self):self.public_attribute = 10self.__private_attribute = 20def public_method(self):print("这是一个公共方法")def __private_method(self):print("这是一个私有方法")
# 创建 MyClass 的一个实例
my_instance = MyClass()
# 访问公共属性
print(my_instance.public_attribute)  # 输出: 10
# 尝试访问私有属性(这将不起作用)
# print(my_instance.__private_attribute)  # AttributeError
# 访问私有属性(通过改名后的名称)
print(my_instance._MyClass__private_attribute)  # 输出: 20
# 调用公共方法
my_instance.public_method()  # 输出: 这是一个公共方法
# 尝试调用私有方法(这将不起作用)
# my_instance.__private_method()  # AttributeError
# 调用私有方法(通过改名后的名称)
my_instance._MyClass__private_method()  # 输出: 这是一个私有方法

在上面的例子中,__private_attribute__private_method被定义为私有属性和方法。尽管可以通过改名后的名称来访问它们,但这通常被认为是不好的做法,因为它违反了封装的原则。

使用属性装饰器

Python还提供了@property装饰器,它可以用来创建只读属性或以方法的形式来访问属性,从而提供一种更可控的访问方式。

class Circle:def __init__(self, radius):self._radius = radius@propertydef radius(self):return self._radius@radius.setterdef radius(self, value):if value < 0:raise ValueError("半径不能为负")self._radius = value
# 创建 Circle 的一个实例
my_circle = Circle(5)
# 访问 radius 属性
print(my_circle.radius)  # 输出: 5
# 设置 radius 属性
my_circle.radius = 10
print(my_circle.radius)  # 输出: 10
# 尝试设置不合法的 radius 值
# my_circle.radius = -1  # ValueError: 半径不能为负

在这个例子中,radius属性通过@property装饰器来设置,它允许我们定义一个只读属性或带有验证的属性。通过使用@property.setter,我们可以控制属性的设置过程,确保属性值符合特定的条件。

总结

虽然Python没有直接的访问修饰符,但通过名称修饰和属性装饰器,可以实现一定程度的访问限制。这些技术有助于保护对象的内部状态,防止外部不必要的干扰,从而维护对象的完整性和一致性。


4.7 获取对象信息

在Python中,你可以使用几种不同的方式来获取对象的信息,例如它的类名、属性、方法等。以下是一些常用的方法来获取对象信息:

type() 函数

type() 函数返回对象的类型,即对象所属的类。

class MyClass:pass
obj = MyClass()
print(type(obj))  # 输出: <class '__main__.MyClass'>

isinstance() 函数

isinstance() 函数用于检查对象是否是某个类的实例。

print(isinstance(obj, MyClass))  # 输出: True
print(isinstance(obj, list))     # 输出: False

dir() 函数

dir() 函数返回一个列表,包含对象的所有属性和方法名。

print(dir(obj))

getattr(), setattr()hasattr() 函数

这些函数用于获取、设置和检查对象的属性。

# 获取属性
print(getattr(obj, 'nonexistent', '默认值'))  # 如果属性不存在,返回'默认值'
# 设置属性
setattr(obj, 'new_attribute', 'value')
# 检查属性是否存在
print(hasattr(obj, 'new_attribute'))  # 输出: True

__dict__ 属性

对象的__dict__属性是一个字典,包含了对象的所有属性和它们的值。

print(obj.__dict__)

inspect 模块

inspect 模块提供了更多用于获取对象信息的工具。例如,getmembers() 函数返回一个列表,包含对象的所有成员。

import inspect
for name, value in inspect.getmembers(obj):print(f"{name}: {value}")

示例

下面是一个简单的示例,展示了如何使用上述方法来获取对象的信息:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef say_hello(self):print(f"你好,我是{self.name},今年{self.age}岁。")
# 创建 Person 类的实例
person = Person("Alice", 30)
# 使用 type() 获取对象的类型
print(type(person))  # 输出: <class '__main__.Person'>
# 使用 isinstance() 检查对象是否是 Person 类的实例
print(isinstance(person, Person))  # 输出: True
# 使用 dir() 获取对象的所有属性和方法名
print(dir(person))
# 使用 getattr() 获取对象的属性
print(getattr(person, 'name', '未知'))  # 输出: Alice
# 使用 setattr() 设置对象的属性
setattr(person, 'name', 'Bob')
# 使用 hasattr() 检查对象是否有某个属性
print(hasattr(person, 'name'))  # 输出: True
# 使用 __dict__ 获取对象的属性字典
print(person.__dict__)
# 使用 inspect.getmembers() 获取对象的所有成员
for name, value in inspect.getmembers(person):print(f"{name}: {value}")

在这个例子中,我们定义了一个Person类,并创建了一个Person类的实例person。然后我们使用不同的方法来获取person对象的信息。这些方法可以帮助开发者了解对象的详细信息,从而更好地进行调试和开发。

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

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

相关文章

单晶层状氧化物制作方法技术资料 纳离子技术

网盘 https://pan.baidu.com/s/1hjHsXvTXG74-0fDo5TtXWQ?pwd10jk 单晶型高熵普鲁士蓝正极材料及其制备方法与应用.pdf 厘米级铬氧化物单晶及其制备方法和存储器件.pdf 多孔氧化物单晶材料及其制备方法和应用.pdf 大单晶层状氧化物正极材料及其制备方法和应用.pdf 富钠P2相层状…

docker k8s

1、docker是什么&#xff1f; 将环境和程序一起打包给到 服务器运行的工具软件。 2、基础镜像base image是什么&#xff1f; 操作系统&#xff1a;用户空间、内核空间 阉割操作系统&#xff0c;利用其的用户空间&#xff08;因为应用程序运行在用户空间&#xff09;&#xf…

量化交易之机器学习篇 - 实现K近邻模型的两种方式

# 导入相关模块import numpy as npfrom collections import Counter import matplotlib.pyplot as pltfrom sklearn import datasets from sklearn.utils import shuffledef load_data():iris datasets.load_iris()# 打乱数据后的数据和标签X, y shuffle(iris.data, iris.tar…

【机器学习】在【Pycharm】中的应用:【线性回归模型】进行【房价预测】

专栏&#xff1a;机器学习笔记 pycharm专业版免费激活教程见资源&#xff0c;私信我给你发 python相关库的安装&#xff1a;pandas,numpy,matplotlib&#xff0c;statsmodels 1. 引言 线性回归&#xff08;Linear Regression&#xff09;是一种常见的统计方法和机器学习算法&a…

弹性力学讲义

弹性力学讲义 1. 基本假设和一些概念2. 应力3. 二维应力状态与摩尔库伦屈服准则 1. 基本假设和一些概念 力学&#xff1a;变形体力学–固体力学和流体力学&#xff08;连续介质力学&#xff09; 刚体力学–理论力学&#xff08;一般力学&#xff09; 物理受理后&#xff1a;要…

Facebook的投流技巧有哪些?

相信大家都知道Facebook拥有着巨大的用户群体和高转化率&#xff0c;在国外社交推广中的影响不言而喻。但随着Facebook广告的竞争越来越激烈&#xff0c;在Facebook广告上获得高投资回报率也变得越来越困难。IPIDEA代理IP今天就教大家如何在Facebook上投放广告的技巧&#xff0…

python–基础篇–正则表达式–是什么

文章目录 定义一&#xff1a;正则表达式就是记录文本规则的代码定义一&#xff1a;正则表达式是一个特殊的字符序列&#xff0c;用于判断一个字符串是否与我们所设定的字符序列是否匹配&#xff0c;也就是说检查一个字符串是否与某种模式匹配。初识 Python 正则表达式 定义一&a…

D : 合适的顺序

Description 给定 8 个数&#xff0c;如果将它们排成一列&#xff0c;每个数的权值是它与相邻的数之积&#xff0c;求一个排列方式&#xff0c;所有数的权值之和最大&#xff0c;输出该权值和. 例如 13242315 的权值和为 1∗33∗1∗22∗3∗44∗2∗22∗4∗33∗2∗11∗3∗55∗1…

新工具:轻松可视化基因组,部分功能超IGV~

本次分享一个Python基因组数据可视化工具figeno。 figeno擅长可视化三代long reads、跨区域基因组断点视图&#xff08;multi-regions across genomic breakpoints&#xff09;、表观组数据&#xff08;HiC、ATAC-seq和ChIP-seq等&#xff09;可视化、WGS中的CNV和SV可视化等。…

第四周——单词记忆

deploy 部署 attorney 律师 discrimination 歧视&#xff0c;区别 implicit 含蓄的 disposition 性格&#xff0c;倾向 entail 牵涉 retail 零售 imposing 印象深刻的 壮观的 implication 含义 entrenched 根深蒂固的 perplex 使复杂化 comply 遵守 composed 沉着…

小米平板6系列对比

小米平板6系列目前有4款&#xff0c;分别为6、6 Pro、6 Max、6S Pro。具体对比如下表所示。 小米平板型号66 Pro6 Max6S Pro实物图发布时间2023年4月21日2023年4月21日2023年8月14日2024年2月22 日屏幕大小11英寸11英寸14英寸12.4英寸分辨率2.8K2.8K2.8K3K刷新率144Hz144Hz120…

43 - 部门工资前三高的所有员工(高频 SQL 50 题基础版)

43 - 部门工资前三高的所有员工 # dense_rank 排名selectDepartment,Employee,Salary from(selectd.name as Department,e.name as Employee,e.salary as Salary,(dense_rank() over (partition by d.name order by e.salary desc)) as rankingfrom Employee e left join Depar…

数据库-存储过程,函数与触发器

创建存储过程&#xff1a;create procedure 存储过程名(参数) eg: CREATE PROCEDURE proc1() BEGIN SELECT * FROM user; END; 执行存储过程&#xff1a;call 存储过程名 创建带有参数的存储过程 存储过程的参数有三种&#xff1a; IN&#xff1a;输入参数&#xff0c;也是…

18 学渣的逆袭之路

在小学阶段&#xff08;本篇特指五年级&#xff0c;一到四年级随便学学就可以逆袭90分&#xff0c;六年级难度飙升&#xff09;&#xff0c;无论你的分数怎么低&#xff0c;只要有一颗上进的心&#xff0c;就绝对可以逆袭95&#xff01; 在本篇文章&#xff0c;我将会讲解“对于…

【前端那些事】Node.js的安装并配置镜像源

1、官网下载地址 Download Node.js 一步一步点击安装即可&#xff0c;可自定义安装目录 2、配置镜像源 # 设置淘宝镜像源 npm config set registry https://registry.npmmirror.com# 查看使用的镜像源 npm config get registry 如果需要恢复为npm默认的官方源&#xf…

intellij idea安装R包ggplot2报错问题求解

1、intellij idea安装R包ggplot2问题 在我上次解决图形显示问题后&#xff0c;发现安装ggplot2包时出现了问题&#xff0c;这在之前高版本中并没有出现问题&#xff0c; install.packages(ggplot2) ERROR: lazy loading failed for package lifecycle * removing C:/Users/V…

java:aocache的单实例缓存(一)

上一篇博客《java:aocache:基于aspectJ实现的方法缓存工具》介绍了aocache的基本使用&#xff0c; 介绍AoCacheable注解时说过&#xff0c;AoCacheable可以定义在构造方法上&#xff0c;定义在构造方法&#xff0c;该构建方法就成了单实例模式。 也就是说&#xff0c;只要构建…

Java实现按高度或宽度等比压缩图片尺寸

要实现一个能够按高度或宽度等比压缩图片并返回InputStream的Java方法&#xff0c;你需要先计算图片的原始宽高比&#xff0c;然后根据目标尺寸&#xff08;宽度或高度&#xff09;计算出等比缩放后的另一个维度。以下是一个示例代码&#xff1a; import javax.imageio.ImageI…

理解cpu对地址的操作

在硬件编程中,外设寄存器被映射到内存或输入/输出(I/O)的地址空间上,这种映射使得CPU能够通过读写这些地址来控制外设。这种机制通常被称为内存映射I/O(MMIO)或端口映射I/O(PMIO),其中MMIO更为常见。以GPIO(通用输入输出)为例,下面是这个过程的一般性描述: MMIO(…

【云原生】MiniKube部署Kubernetes最小化集群

MiniKube安装Kubernetes集群&#xff08;一步到位&#xff09; 文章目录 MiniKube安装Kubernetes集群&#xff08;一步到位&#xff09;资源列表基础环境一、环境配置1.1、更新系统1.2、安装Docker1.3、配置Docker加速器 二、部署MiniKube2.1、安装kubectl2.2、安装MiniKube2.2…