百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

一文了解 Python 中的面向对象编程

liebian365 2025-03-03 19:16 16 浏览 0 评论

Python 是一种多功能编程语言,支持多种编程范例,包括面向对象编程 (OOP) 和过程编程。这种灵活性使开发人员可以根据项目的具体需求选择最合适的范例,结合每种方法的优势来实现最佳结果。

Python 过程式编程

过程式编程基于过程调用的概念。它像菜谱一样构建程序,以函数和代码块的形式提供一组步骤,这些步骤顺序流动以完成任务。这种范例对于可以通过一系列过程步骤完成的简单任务特别有用,使代码易于理解和调试。

Python 中的面向对象编程 (OOP)

面向对象编程(OOP)是一种使用对象和类来构建软件程序的编程范例。它强调将数据(属性)和对数据进行操作的行为(方法)捆绑到称为对象的单个单元中。这种方法有利于对现实世界的实体进行建模、促进代码重用以及促进复杂软件系统的开发。

换句话说,OOP 是一种围绕数据或对象而不是功能和逻辑来组织软件设计的范例。对象可以定义为具有独特属性和行为的数据字段。 Python 对 OOP 的支持非常广泛,允许开发人员实现类、继承、多态性和封装(我们将详细了解所有内容),从而更轻松地创建可以模拟真实场景的复杂、可重用和模块化代码。

何时使用 OOP 或过程编程

在面向对象编程和过程式编程之间进行选择取决于多种因素,包括应用程序的复杂性、团队偏好以及正在开发的软件的具体要求。一般来说,OOP 更适合具有复杂数据模型和行为、需要可重用和模块化代码的应用程序。另一方面,过程式编程可能更适合更简单的、基于任务的脚本,其中执行简单的操作序列。

在 OOP 中,类是创建对象的蓝图。它定义了创建的类对象将具有的一组属性和方法。类提供了一种将数据和功能捆绑在一起的方法。

Python 中的类可以想象是一个印章票。想象一下,您有一个设计用于生成特定形状或图案的印章 - 该印章是您的班级。每次将印章压到材料上时,您都会创建印章定义的形状或图案的精确复制品。这些副本类似于 Python 中的对象。正如图章封装了设计细节并且可以重复使用来生成多个副本(对象)一样,类封装了数据(属性)和行为(方法)并且可以多次实例化以创建多个对象。

每个对象都是一个独特的实例,可以在其属性中保存不同的值,类似于如何在不同的材料或不同的颜色上制作每个印章印象,但所有对象都共享相同的基础设计。

在 Python 中创建类非常简单明了:

class MyClass:
    # Class attribute
    attribute = "This is a class attribute."

    # Initializer / Instance attributes
    def __init__(self, value):
        self.instance_attribute = value

    # Method
    def my_method(self):
        return f"My instance attribute is: {self.instance_attribute}"

在此示例中, MyClass 具有类属性 attribute 、设置实例属性的初始化方法 __init__ 以及操作的方法 my_method 关于实例属性。

对象

对象是类的实例。定义类时,只定义了对象的描述;因此,没有分配内存或存储空间。对象是在实例化时从类创建的。 每个对象的属性可以具有不同的值,以将其与同一类的其他对象区分开来(记住邮票示例)。

创建对象就像调用类一样简单:

my_object = MyClass("Hello, Object!")
print(my_object.instance_attribute)  # Accessing an instance attribute
print(my_object.my_method())  # Calling a method on the objectoo

类属性

在面向对象编程 (OOP) 中,属性是属于类或类实例的变量。它们表示对象的属性或特征,有助于将其与其他对象区分开来。属性用于存储有关对象的信息,并且可以在对象的生命周期内访问或修改它们。

OOP 中有两种主要类型的属性:类属性和实例属性。

类属性是在类的所有实例之间共享的变量。它们属于类本身,而不属于任何单独的实例。这意味着,如果更改类属性的值,则更改会反映在该类的所有实例中。类属性示例:

class Dog:
    species = "Canis familiaris"  # Class attribute

    def __init__(self, name, age):
        self.name = name  # Instance attribute
        self.age = age  # Instance attribute

# Accessing a class attribute
print(Dog.species)  # Output: Canis familiaris

# Class attributes are shared by all instances
dog1 = Dog("Buddy", 5)
dog2 = Dog("Molly", 3)
print(dog1.species)  # Output: Canis familiaris
print(dog2.species)  # Output: Canis familiaris

类属性的主要应用之一是定义与类相关的全局常量。例如,考虑一个场景,您正在创建一个类来表示不同的形状。在 Circle 类中,您可以将 pi 的值指定为类属性,因为它是圆上下文中常用的常量。这有助于保持整个代码的一致性和清晰度。

实例属性

实例属性由类的特定实例拥有。这意味着对于每个对象或类的实例,实例属性都是不同的(除非显式设置为相同的值)。

实例属性通常在 __init__ 方法中定义,也称为初始化器或构造函数,它们以 self 为前缀,表示它们属于特定的实例。类的实例。

class Dog:
    # Class attribute
    species = "Canis familiaris"

    def __init__(self, name, age):
        self.name = name  # Instance attribute
        self.age = age  # Instance attribute

# Each instance has its own attributes
dog1 = Dog("Buddy", 5)
dog2 = Dog("Molly", 3)

print(dog1.name)  # Output: Buddy
print(dog2.name)  # Output: Molly

属性要点

  • 属性存储有关对象的数据。
  • 类属性由该类的所有实例共享。更改类属性会影响所有实例。
  • 实例属性对于每个实例都是唯一的。更改实例属性仅影响该特定实例。
  • 可以使用点表示法访问属性(例如 instance.attributeClass.attribute )。

理解属性是 OOP 的基础,因为它们对于定义对象的状态和区分类的不同实例至关重要。它们允许对象在对其进行操作的函数之间维护状态,从而实现对象内数据的封装。

面向对象编程中的方法

Python 中的方法是在类中定义的函数,用于定义对象的行为。它们可以对类包含的数据(属性)进行操作,并且可以使用类的对象进行访问。方法对于实现对象的功能至关重要。

Python中有几种类型的方法:

  • 实例方法:对类的实例进行操作并有权访问实例 ( self ) 及其属性。
  • 类方法:对类本身进行操作,而不是对类的实例进行操作。它们用 @classmethod 装饰器标记,并以 cls 作为第一个参数。
  • 静态方法:不要对实例或类进行操作。它们用 @staticmethod 装饰器标记,并且不将 selfcls 作为第一个参数。它们用于不访问类或实例数据的实用函数。

为了说明 Python 中方法的使用,创建一个类 Car 来演示实例方法、类方法和静态方法。此示例将有助于阐明如何在类中使用不同类型的方法来操作数据和管理行为。

class Car:
    # Class attribute
    total_cars = 0

    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        Car.total_cars += 1  # Increment the total number of cars each time a new car is created

    # Instance method
    def description(self):
        """Returns a description of the car."""
        return f"{self.year} {self.make} {self.model}"

    # Class method
    @classmethod
    def total_cars_created(cls):
        """Returns the total number of cars created."""
        return f"Total cars created: {cls.total_cars}"

    # Static method
    @staticmethod
    def is_vintage(year):
        """Determines if a car is vintage based on its year."""
        return year < 1990

示例:使用Car类

现在,让我们使用 Car 类创建一些汽车对象,调用实例方法,使用类方法获取创建的汽车总数,并使用静态方法检查汽车是否被视为老式汽车。

# Creating car objects
car1 = Car("Toyota", "Corolla", 1985)
car2 = Car("Ford", "Mustang", 1968)
# Using an instance method
print(car1.description())  # Output: 1985 Toyota Corolla
print(car2.description())  # Output: 1968 Ford Mustang
# Using a class method
print(Car.total_cars_created())  # Output: Total cars created: 2
# Using a static method
print(Car.is_vintage(1985))  # Output: True
print(Car.is_vintage(1995))  # Output: False

类代码说明

  • 实例方法: description 方法是实例方法,因为它对 Car 类 ( self ) 实例的属性进行操作。它提供了描述汽车的格式化字符串。
  • 类方法: total_cars_created 方法是一个类方法,如 @classmethod 装饰器所示。它对类本身( cls )而不是类的实例进行操作。此方法访问类属性 ( total_cars ) 以返回创建的 Car 实例的总数。
  • 静态方法: is_vintage 方法是静态方法,用 @staticmethod 装饰器标记。它不使用 selfcls 作为参数,使其独立于类和实例状态。它执行简单的检查,根据老式汽车必须是 1990 年之前的标准,确定给定年份的汽车是否符合老式汽车的资格。

此示例演示如何在 Python 类中定义和使用实例方法、类方法和静态方法,展示它们在面向对象编程方法中组织和管理数据和行为方面各自的用途和优点。

python中三类方法详解

Python 中的实例方法

实例方法是 Python 中面向对象编程 (OOP) 的基本概念。它们用于定义可以使用类实例执行的行为和操作。了解实例方法对于在 Python 中设计和实现封装数据以及对该数据的操作的类至关重要。

什么是实例方法?

实例方法是在类内部定义的、作用于该类实例的函数。它们可以访问和修改实例的状态,因为它们包含对实例本身的引用,通常名为 self 。这个 self 参数是 Python OOP 中的约定,允许实例方法访问同一对象上的属性和其他方法。

如何定义和使用实例方法

要定义实例方法,只需在类中声明一个函数即可。该方法的第一个参数必须是 self ,它是对调用该方法的实例的引用。这允许该方法访问和操作实例的属性。

下面用一个基本的例子来说明实例方法的定义和使用:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # Instance method
    def introduce_yourself(self):
        print(f"Hello, my name is {self.name} and I am {self.age} years old.")

# Creating an instance of the Person class
person1 = Person("Alice", 30)

# Calling an instance method on the person1 instance
person1.introduce_yourself()

在此示例中, introduce_yourselfPerson 类的实例方法。它通过 self 参数访问实例 person1nameage 属性来打印问候语。

实例方法的要点

  • 访问实例属性:实例方法可以自由访问和修改附加到其所属实例的属性。
  • 第一个参数是 self :实例方法中的 self 参数指的是调用该方法的实例,它允许该方法访问实例的属性和其他方法。
  • 在实例上调用:与类方法或静态方法不同,实例方法是在特定对象实例上调用的,而不是在类本身上调用的。

数据项目中的实际使用

在数据科学和工程项目的背景下,实例方法可用于封装与自定义类中的数据处理、分析和可视化相关的功能。例如,您可能有一个包装 pandas DataFrame 的 DataFrameWrapper 类,该类的实例方法可能包含清理数据、执行计算或生成特定于数据集的绘图的功能。

理解和利用实例方法可以使数据项目中的代码更有组织性、可读性和可维护性,并遵循 OOP 中的封装和抽象原则。

Python 中的类方法

类方法是 Python 面向对象编程 (OOP) 的一个重要功能,它允许您定义对类本身而不是类的实例进行操作的函数。这些方法遵循 @classmethod 装饰器,并通过使用 cls 作为其第一个参数来区分,该参数表示类本身,类似于 self 表示实例的方式实例方法中的类。

类方法只能访问类本身及其属性;他们无权访问实例级数据。这意味着在类方法中,您无法直接访问或修改实例属性。相反,类方法通常用于涉及整个类而不是单个实例的操作。

定义和使用类方法

要定义类方法,请在方法定义上方使用 @classmethod 装饰器。类方法的第一个参数通常命名为 cls ,它是对调用该方法的类的引用。这允许类方法访问类变量和其他类方法。

下面是一个示例来演示如何定义和使用类方法:

class Employee:
    num_of_employees = 0  # Class variable

    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        Employee.num_of_employees += 1

    @classmethod
    def get_num_of_employees(cls):
        return f"Total number of employees: {cls.num_of_employees}"

# Accessing a class method without creating an instance
print(Employee.get_num_of_employees())

# Creating instances of Employee
emp1 = Employee("John", 50000)
emp2 = Employee("Doe", 60000)

# Accessing the class method after creating instances
print(Employee.get_num_of_employees())

在此示例中, get_num_of_employees 是一个返回员工总数的类方法,这是一个跟踪从 Employee 类创建的实例数量的类变量。请注意我们如何在 Employee 类本身上调用 get_num_of_employees ,而无需创建该类的实例。

类方法的主要特征

  • 对类进行操作:与实例方法不同,类方法对类本身进行操作,而不是对单个实例进行操作。他们可以修改适用于类的所有实例的类状态。
  • cls 参数的使用:类方法中的 cls 参数指的是调用该方法的类。这允许类方法访问类变量和其他方法。
  • @classmethod 装饰器标记: @classmethod 装饰器用于指示方法是类方法。

数据项目中的实际应用

当需要执行与整个类而不是单个实例相关的操作时,类方法特别有用。在数据科学项目中,类方法可用于实现从不同格式的数据创建实例的工厂方法,以跟踪与所有实例相关的统计信息,或为数据处理类配置全局设置。

例如,如果您有一个处理数据集的类,则可以使用类方法来设置类级别参数,该参数定义要由该类的所有实例处理的数据文件(CSV、JSON 等)的默认格式。这种方法促进了干净、有组织和模块化的代码库,促进了数据项目更好的维护和可扩展性。

Python 中的静态方法

Python 面向对象编程 (OOP) 中的静态方法是一种既不操作类实例(如实例方法),也不操作类本身(如类方法)的方法。它们是属于类的实用函数,但不访问或修改类或特定于实例的数据。静态方法用 @staticmethod 装饰器标记,并且不将 selfcls 作为第一个参数。

定义和使用静态方法

要定义静态方法,请在方法定义上方使用 @staticmethod 装饰器。由于静态方法不对类或实例进行操作,因此它们不需要 selfcls 参数。它们可以采用任意数量的参数,也可以不采用任何参数,具体取决于方法的设计目的。

下面是一个演示静态方法的定义和用法的示例:

class MathOperations:
    
    @staticmethod
    def add(x, y):
        return x + y

    @staticmethod
    def multiply(x, y):
        return x * y

# Using static methods without creating an instance of the class
print(MathOperations.add(5, 7))  # Output: 12
print(MathOperations.multiply(3, 4))  # Output: 12

在此示例中, addmultiplyMathOperations 类的静态方法,分别执行加法和乘法。这些方法在类本身上调用,而不需要实例化类的对象。

静态方法的主要特征

  • 独立于类和实例:静态方法不访问或修改类状态或实例状态。它们独立运行,充当效用函数。
  • selfcls 参数:静态方法不包含 selfcls 参数,因为它们不对实例或类进行操作本身。
  • @staticmethod 装饰器标记: @staticmethod 装饰器用于指示方法是静态方法。

数据项目中的实际应用

静态方法非常适合执行与类的核心职责不直接相关的任务的实用程序或辅助函数。在数据科学和工程项目中,静态方法可用于通用的计算、数据验证或处理步骤,与类或其实例的特定状态无关。

例如,如果您有一个处理数据转换的类,则可以包含用于验证数据格式、清理字符串或在测量单位之间进行转换的静态方法。这些方法与类的域相关,但不需要访问类或实例数据,这使它们成为静态方法的完美候选者。

使用静态方法有助于保持代码的组织性、模块化和更易于理解,因为它清楚地区分了属于对象行为的操作和通用实用程序的操作。

结论:为数据科学及其他领域的 OOP 奠定基础

Python 中的面向对象编程提供了一种强大而直观的方法来建模现实世界的实体并构建复杂的应用程序。通过理解和使用类、对象和方法,开发人员可以编写更加模块化、可重用且易于理解的代码。

本文标志着一个启发性系列的开始,旨在探索面向对象编程 (OOP) 在数据科学、机器学习、深度学习和大型语言模型 (LLMs) 领域的应用。

我们的 Python OOP 错综复杂的旅程不仅仅是理解语法或记忆模式;还包括理解语法或记忆模式。这是关于拥抱一种范式,可以从根本上改变我们在这些先进领域解决问题的方式。

OOP 提供了一种结构化且可扩展的方式来管理复杂的软件项目,包括数据密集型应用程序。通过将数据和行为封装到对象中,我们可以更自然地对现实世界的现象进行建模,使我们的代码更加直观、可维护和可重用。

这在数据科学和机器学习中尤其重要,其中数据和算法的复杂性需要 OOP 唯一有资格提供的组织和抽象级别。

随着我们深入研究本系列,我们将探索如何应用 OOP 原则来设计强大的数据模型、实现机器学习算法、管理大型数据集和构建可扩展的数据管道。我们还将研究 OOP 如何增强 LLMs 工具和框架的开发,从而促进创建更复杂和用户友好的界面来与这些强大的模型进行交互。

从类、对象和方法的基本概念到继承、多态性和设计模式等更高级的主题,本系列旨在为您提供在数据科学和机器学习项目中利用 OOP 的知识和技能。无论您是分析大量数据集、构建预测模型还是开发尖端的 AI 应用程序,了解 OOP 都将为支持您的工作提供坚实的基础。

请记住,通过 OOP 的旅程类似于掌握一种新的思维方式。它是通过对象及其交互的视角来看待编程世界,这种视角可以为复杂问题提供更优雅、更有效的解决方案。

因此,无论您是渴望学习基础知识的初学者,还是希望在数据科学和机器学习背景下加深对 OOP 理解的经验丰富的程序员,本系列都将成为宝贵的资源。加入我们,开始这一激动人心的探索,让我们释放 OOP 在数据科学、机器学习等方面的全部潜力。

这只是一个开始,当我们一起继续这一旅程时,我迫不及待地想分享我的学习笔记和经验中的更多见解。

相关推荐

“版本末期”了?下周平衡补丁!国服最强5套牌!上分首选

明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...

VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符&quot;

首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...

东营交警实名曝光一批酒驾人员名单 88人受处罚

齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...

Qt界面——搭配QCustomPlot(qt platform)

这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...

大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写

老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...

测试谷歌VS Code AI 编程插件 Gemini Code Assist

用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...

顾爷想知道第4.5期 国服便利性到底需优化啥?

前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...

掌握Visual Studio项目配置【基础篇】

1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...

还嫌LED驱动设计套路深?那就来看看这篇文章吧

随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...

Visual Studio Community 2022(VS2022)安装图文方法

直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...

Qt添加MSVC构建套件的方法(qt添加c++11)

前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...

Qt为什么站稳c++GUI的top1(qt c)

为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...

qt开发IDE应该选择VS还是qt creator

如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...

Qt 5.14.2超详细安装教程,不会来打我

Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...

Cygwin配置与使用(四)——VI字体和颜色的配置

简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...

取消回复欢迎 发表评论: