面向对象编程(一)

news/2025/2/13 20:27:23/

文章目录

  • 类的实例属性
  • 类的属性(Attributes)
  • 类的实例方法
  • 类的方法(Methods)

在 Python 中,类(Class)是一种定义对象(Object)的结构,它包含了对象的状态(属性)和行为(方法)。类提供了一种方式来封装和组织代码,使得代码更加模块化和可重用。

下面是一个简单的 Python 类的示例:

class Person:# 类的属性(通常称为类变量或静态变量)species = "Human"# 类的构造方法(初始化方法),在创建对象时调用def __init__(self, name, age):# 实例属性,每个对象都有自己的属性值self.name = nameself.age = age# 类的方法,定义对象的行为def greet(self):print(f"Hello, my name is {self.name} and I am {self.age} years old.")# 类的静态方法,通过类直接调用,不需要创建对象@staticmethoddef species_info():return f"The species of this class is {Person.species}."# 创建类的实例(对象)
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)# 访问对象的属性和方法
print(person1.name)    # 输出: Alice
print(person2.age)     # 输出: 25
person1.greet()        # 输出: Hello, my name is Alice and I am 30 years old.# 访问类的静态方法
print(Person.species_info())  # 输出: The species of this class is Human.

在上面的例子中,Person 是一个类,它有一个类变量 species 和一个构造方法 init,以及一个实例方法 greet 和一个静态方法 species_info。

  • init 方法是一个特殊的方法,被称为构造器或初始化方法。当创建类的新实例时,它会自动被调用。
  • greet 方法是一个实例方法,它必须通过类的实例来调用,并且它可以访问和修改实例的属性。
  • species_info 方法是一个静态方法,它使用 @staticmethod 装饰器定义。静态方法不需要访问或修改实例的状态,它们可以通过类本身来调用。

通过类,你可以创建多个具有相同属性和方法的对象,这些对象可以具有不同的属性值,从而实现代码的复用和灵活性。

类的实例属性

在 Python 中,类的实例属性是指与类的单个实例相关联的属性。这些属性是在创建类的实例时通过初始化方法(init 方法)设置的,并且每个实例都有其自己的属性副本,这些副本可以独立地修改而不会影响其他实例。

下面是一个简单的例子,展示了如何在 Python 类中定义和访问实例属性:

class Person:def __init__(self, name, age):# 实例属性通过初始化方法设置self.name = nameself.age = agedef introduce(self):# 实例方法可以通过self访问实例属性print(f"Hello, my name is {self.name} and I am {self.age} years old.")# 创建Person类的两个实例
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)# 访问和修改实例属性
print(person1.name)  # 输出: Alice
print(person1.age)   # 输出: 30
person1.age += 1     # 修改person1的age属性# 调用实例方法
person1.introduce()  # 输出: Hello, my name is Alice and I am 31 years old.# 访问另一个实例的属性
print(person2.name)  # 输出: Bob
print(person2.age)   # 输出: 25# 注意:修改person1的属性不会影响person2的属性

在这个例子中,Person 类有两个实例属性:name 和 age。这些属性是通过 init 方法初始化的,并且在每个实例中都是唯一的。当我们修改 person1.age 的值时,这只会影响 person1 实例,而 person2 实例的 age 属性保持不变。

实例属性是对象导向编程中封装和信息隐藏的一个关键部分,因为它们允许我们为每个对象存储独特的状态信息。

类的属性(Attributes)

在Python中,类的属性(Attributes)是类定义的一部分,用于存储类的状态信息。属性可以是实例属性(Instance Attributes),即与类的特定实例相关的属性,也可以是类属性(Class Attributes),即与类本身相关的属性,而不是与类的任何特定实例相关的属性。

以下是一个简单的示例,展示了如何在Python类中定义和使用属性:

class MyClass:# 类属性class_attribute = "This is a class attribute."def __init__(self, instance_attribute):# 实例属性self.instance_attribute = instance_attribute# 创建类的实例
obj = MyClass("This is an instance attribute.")# 访问类属性
print(MyClass.class_attribute)  # 输出: This is a class attribute.# 访问实例属性
print(obj.instance_attribute)  # 输出: This is an instance attribute.# 为实例添加新的实例属性
obj.new_instance_attribute = "This is a new instance attribute."
print(obj.new_instance_attribute)  # 输出: This is a new instance attribute.# 修改实例属性
obj.instance_attribute = "This is a modified instance attribute."
print(obj.instance_attribute)  # 输出: This is a modified instance attribute.# 尝试访问不存在的属性会抛出 AttributeError
# print(obj.non_existent_attribute)  # 抛出 AttributeError

在这个例子中,class_attribute 是一个类属性,它属于类本身,而不是类的任何特定实例。所有实例共享相同的类属性。而 instance_attribute 是一个实例属性,它特定于类的每个实例。当你创建一个类的实例时,可以为它分配特定的实例属性。

你可以通过实例或类本身来访问类属性,但是只能通过实例来访问实例属性。尝试通过类来访问实例属性将会抛出一个 AttributeError 异常。

类属性通常在类定义时设置,并且可以用于定义类级别的常量、状态或与类相关的其他信息。实例属性则用于存储与特定对象状态相关的信息。

类的实例方法

在Python中,实例方法是与类的特定实例相关联的方法。它们可以通过该实例来调用,并且可以访问和修改该实例的属性以及调用该实例的其他方法。实例方法至少接受一个参数,通常命名为self,它代表类实例本身。以下是一些定义和使用实例方法的例子:

class Circle:def __init__(self, radius):self.radius = radius# 实例方法:计算圆的面积def area(self):return 3.14 * self.radius ** 2# 实例方法:计算圆的周长def perimeter(self):return 2 * 3.14 * self.radius# 创建一个Circle类的实例
circle = Circle(5)# 调用实例方法
print(circle.area())  # 输出圆的面积
print(circle.perimeter())  # 输出圆的周长

在这个例子中,Circle 类有两个实例方法:area 和 perimeter。这两个方法都接受一个参数 self,它代表 Circle 类的一个实例。通过 self,方法可以访问实例的属性(如 self.radius),并且可以执行与实例相关的操作。

当我们创建一个 Circle 类的实例 circle 并调用它的 area 和 perimeter 方法时,Python 会自动将 circle 实例作为第一个参数传递给这些方法。

实例方法还可以接受其他参数,以支持更复杂的功能。例如,如果我们想定义一个方法来设置圆的半径,我们可以这样做:

class Circle:def __init__(self, radius):self.radius = radiusdef set_radius(self, new_radius):self.radius = new_radius# 创建一个Circle类的实例
circle = Circle(5)# 调用set_radius实例方法来设置新的半径
circle.set_radius(10)# 再次调用area和perimeter方法,将使用新的半径
print(circle.area())  # 输出新的圆的面积
print(circle.perimeter())  # 输出新的圆的周长

在这个例子中,我们添加了一个 set_radius 实例方法,它接受一个参数 new_radius,用于设置实例的 radius 属性。

类的方法(Methods)

在Python中,类的方法(Methods)是定义在类内部的函数,它们与类的实例或类本身相关联,并可以通过实例或类来调用。方法通常用于执行与类的状态或行为相关的操作。

方法可以分为实例方法(Instance Methods)、类方法(Class Methods)和静态方法(Static Methods)。
实例方法

实例方法是与类的实例(对象)相关联的方法。它们至少接收一个参数,通常命名为self,代表类的实例本身。实例方法可以通过类的实例来调用,并且可以访问和修改实例的属性。

class MyClass:def __init__(self, name):self.name = namedef say_hello(self):print(f"Hello, my name is {self.name}")# 创建实例
obj = MyClass("Alice")# 调用实例方法
obj.say_hello()  # 输出: Hello, my name is Alice

类方法

类方法是与类本身相关联的方法,而不是与类的实例相关联。类方法使用装饰器@classmethod来定义,并且它们的第一个参数是类本身,通常命名为cls。类方法可以通过类本身或类的实例来调用,但它们通常不访问或修改实例的属性。

class MyClass:@classmethoddef print_class_name(cls):print(cls.__name__)# 调用类方法
MyClass.print_class_name()  # 输出: MyClass# 也可以通过实例调用类方法
obj = MyClass()
obj.print_class_name()  # 输出: MyClass

静态方法

静态方法与类及其实例都没有直接的关联。它们只是定义在类内部的普通函数,使用装饰器@staticmethod来定义。静态方法不需要特殊的参数来引用类或实例。

class MyClass:@staticmethoddef static_method():print("This is a static method.")# 调用静态方法
MyClass.static_method()  # 输出: This is a static method.# 也可以通过实例调用静态方法
obj = MyClass()
obj.static_method()  # 输出: This is a static method.

属性方法

除了上述方法外,Python类还可以定义属性方法(也称为getter和setter方法),用于访问和修改实例属性的值。属性方法通过装饰器@property来定义getter方法,并使用@property.setter来定义setter方法。

class Person:def __init__(self, name):self._name = name@propertydef name(self):return self._name@name.setterdef name(self, value):if isinstance(value, str):self._name = valueelse:raise ValueError("Name must be a string.")# 创建实例
person = Person("Bob")# 访问属性
print(person.name)  # 输出: Bob# 修改属性
person.name = "Alice"
print(person.name)  # 输出: Alice# 尝试修改属性为非法类型
person.name = 123  # 抛出 ValueError

在这个例子中,name 是一个属性,可以通过 person.name 来访问和修改。当访问 name 属性时,会调用相应的 getter 方法。当为 name 属性赋值时,会调用相应的 setter 方法,该方法会检查值的有效性。


http://www.ppmy.cn/news/1396910.html

相关文章

SpringMVC使用validation参数校验

Maven引入依赖 <!-- validation依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>常用参数和正则表达式 spring boot-Validated参数校验 Pa…

ubuntu22.04配置Azure Kinect DK深度相机

一.安装SDK 今天我来配置一下微软公司的Azure Kinect DK深度相机&#xff0c;以前在ubuntu18.04上配置过&#xff0c;因为官方说唯一支持linux版本是18.04&#xff0c;所以在18.04中配置还算顺利 but这不代表不可以在更高版本的ubuntu中使用&#xff0c;只不过需要自己…

Spring Cloud Gateway 3.x 获取body中的数据鉴权

前言 SpringCloud Gateway建立在Spring Framework5、Project Reactor和Spring Boot2.0之上&#xff0c;使用WebFlux非阻塞API 什么是WebFlux? 官网&#xff1a;https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html 传统的Web框架&…

3.26总结

JAVA学习今天学了字符串相关类的底层原理&#xff08;简单了解了一下&#xff09;和集合部分&#xff0c;自己试着做了一些集合的简单练习来加强理解 集合和数组部分功能上有些相似&#xff0c;但是总体存在很大区别 1.长度 数组长度固定&#xff0c;集合长度可以改变 2.内…

前端下载超大文件的完整方案

实现步骤 使用分片下载&#xff1a; 将大文件分割成多个小块进行下载&#xff0c;可以降低内存占用和网络传输中断的风险。这样可以避免一次性下载整个大文件造成的性能问题。 断点续传&#xff1a; 实现断点续传功能&#xff0c;即在下载中途中断后&#xff0c;可以从已下载的…

【openGL4.x手册07】几何着色器

目录 一、说明二、关于几何着色器三、原始输入/输出规范3.1 实例 四、输入五、输出5.1 分层渲染 六、输出限制 一、说明 几何着色器对于渲染管线设计是一个新生事物&#xff1b;目前对应于几何着色器的资料不多&#xff0c;并且说法不一&#xff0c;因此如何用几何着色器&…

SQLite数据库成为内存中数据库(三)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite使用的临时文件&#xff08;二&#xff09; 下一篇&#xff1a;SQLite中的原子提交&#xff08;四) ​​ SQLite数据库通常存储在单个普通磁盘中文件。但是&#xff0c;在某些情况下&#xff0c;数据库可能…

在 IntelliJ IDEA 中使用 Terminal 执行 git log 命令后的退出方法

前言 IntelliJ IDEA 是一款广受欢迎的集成开发环境&#xff0c;它内置了强大的终端工具&#xff0c;使得开发者无需离开IDE就能便捷地执行各种命令行操作&#xff0c;包括使用 Git 进行版本控制。在 IDEA 的 Terminal 中执行 git log 命令时&#xff0c;由于该命令会显示项目的…