Python教程(22)——Python面向对象的属性和方法

在Python面向对象编程中,属性和方法是类及其对象的重要组成部分。如果说封装、继承和多态是面向对象编程中的思想,那么类的属性和方法就是骨架,因为有属性和方法,面向对象编程才变的有血有肉。

在这里插入图片描述

属性

属性是类或对象所拥有的数据,它用于描述对象的特征和状态。属性可以是实例属性(对象特有的属性)或类属性(属于类本身的属性)。可以使用点运算符来访问和修改属性的值。

实例属性

实例属性(Instance Attribute)是属于对象实例的属性。每个对象实例都有自己的一组实例属性,这些属性的值可以在对象的生命周期内不断变化。

假设我们要定义一个名为"Car"的类,表示一个车的信息,有一个brand(品牌)。我们可以使用实例属性来表示这些信息。

class Car:
    def __init__(self, brand):
        self.brand = brand

在上面的代码中,我们定义了一个"Car"类,有一个实例属性:brand。在类的构造函数__init__中,我们使用self关键字来引用当前实例对象,并使用点运算符给实例属性赋值。
现在,我们可以创建一个"Car"对象,并访问其实例属性:

car1 = Car("Toyota")
print(car1.brand)  # 输出:Toyota

在上面的代码中,我们创建了一个名为"car1"的"Car"对象,并访问了其实例属性brand,输出结果"Toyota"。
可以注意到,每个实例对象都有自己独立的一组实例属性,并且可以根据具体对象的需求来进行不同的赋值。例如,我们可以创建另一个"Car"对象,给其brand属性赋予不同的值:

car2 = Car("Tesla")
print(car2.brand)  # 输出:Tesla

在上面的代码中,我们创建了一个名为"car2"的"Car"对象,并访问了其实例属性brand,输出结果"Tesla"。
通过实例属性,我们可以通过对象实例来描述其具体的特征和状态。每个实例对象具有相互独立且可以随时修改的实例属性,这使得面向对象编程更加灵活和可扩展。

类属性

类属性(Class Attribute)是属于类的属性,它是所有该类的实例所共享的属性。类属性与任何一个实例对象无关,通常用于定义类的共享数据。

假设我们要定义一个名为"Car"的类,表示汽车的信息,有一个品牌属性和一个数量属性。我们可以使用类属性来表示这些信息。

class Car:
    brand = "Toyota"
    count = 0

    def __init__(self, model):
        self.model = model
        Car.count += 1

在上面的代码中,我们定义了一个"Car"类,有两个类属性:brand和count。在类的构造函数__init__中,我们使用self关键字来引用当前实例对象,并使用点运算符给实例属性model赋值。同时,每次创建一个新的Car对象时,我们都会将count类属性的值加1,以统计Car对象的数量。
现在,我们可以创建几个"Car"对象,并访问其类属性和实例属性:

car1 = Car("Corolla")
car2 = Car("Rav4")

print(Car.brand)  # 输出:Toyota
print(Car.count)  # 输出:2

print(car1.model)  # 输出:Corolla
print(car2.model)  # 输出:Rav4

print(car1.brand)  # 输出:Toyota
print(car2.brand)  # 输出:Toyota

在上面的代码中,我们创建了两个"Car"对象"car1"和"car2"。我们首先使用类名访问类属性brand和count,输出结果分别为"Toyota"(所有"Car"对象的共享品牌属性)和2(创建的"Car"对象数量)。
然后,我们通过对象名访问实例属性model,输出结果分别为"Corolla"和"Rav4"。可以注意到,每个对象实例都有自己独立的实例属性model。最后,我们通过对象名访问类属性brand,输出结果均为"Toyota"。这是因为类属性是所有该类的实例所共享的,所以每个对象实例都可以访问和修改类属性。
通过类属性,我们可以在类层面上定义和管理共享的数据。所有该类的实例都可以通过类名来访问和修改类属性,这使得数据的共享和统一管理更加方便。

方法

方法是类中定义的函数,它与类进行绑定。方法可以访问和操作类的属性,并可被类的实例调用。方法分为实例方法、类方法和静态方法。

实例方法

实例方法(Instance Method)是定义在类中的方法,是绑定到对象实例的,实例方法可以在方法内部访问实例属性,用于操作对象实例的行为,并且可以使用self关键字来引用调用该方法的对象实例。
假设我们仍然以"Car"类为例,除了原有的实例属性之外,我们多一个速度相关的属性,并对外显示当前的速度。这个方法属于实例级别的,表示特定对象实例的行为,我们可以使用实例方法来实现。

class Car:
    def __init__(self, brand, model):
        self.brand = brand
        self.model = model
        self.speed = 0

    def accelerate(self, increment):
        self.speed += increment

    def decelerate(self, decrement):
        if self.speed >= decrement:
            self.speed -= decrement
        else:
            self.speed = 0

    def show_speed(self):
        print("Current speed:", self.speed, "km/h")

在上面的代码中,我们定义了一个"Car"类,有三个实例属性:brand(品牌)、model(型号)和speed(速度)。另外,我们定义了三个实例方法:accelerate(加速)、decelerate(减速)和show_speed(显示速度)。
在方法内部,我们使用self关键字引用当前实例对象的属性,通过对speed属性的增减操作实现加速和减速的功能。show_speed方法用于在终端中显示当前汽车的速度信息。
现在,我们可以创建一个"Car"对象,并调用其实例方法:

car1 = Car("Toyota", "Corolla")
car1.accelerate(40)
car1.show_speed()  # 输出:Current speed: 40 km/h

car1.decelerate(20)
car1.show_speed()  # 输出:Current speed: 20 km/h

在上面的代码中,我们创建了一个名为"car1"的"Car"对象,并先后调用其accelerate和decelerate方法。然后,通过调用show_speed方法打印出了当前汽车的速度信息。

通过实例方法,我们可以为对象实例定义具体的行为。每个实例对象都可以调用实例方法,并且每次调用时,方法内部都可以根据对象实例的具体属性值来进行不同的操作。这使得我们可以方便地操控和控制对象行为,实现更加灵活和可定制的功能。在汽车示例中,我们通过实例方法实现了汽车的加速、减速和显示速度等功能。

类方法

类方法(Class Method)是绑定到类本身的方法,类方法由装饰器@classmethod标记,可以在方法内部访问和修改类属性。
类方法是定义在类中的方法,使用classmethod装饰器修饰,它与实例方法不同的是,类方法是针对整个类进行操作,不依赖于具体的实例对象。下面通过一个示例来详细说明类方法的概念和使用。

class Car:
    total_cars = 0

    def __init__(self, brand, model):
        self.brand = brand
        self.model = model
        Car.total_cars += 1

    @classmethod
    def get_total_cars(cls):
        return cls.total_cars

在上面的代码中,我们定义了一个"Car"类,有两个实例属性:brand(品牌)和model(型号),以及一个类属性total_cars(总车辆数)。另外,我们使用classmethod装饰器修饰了get_total_cars方法,将其定义为类方法。
在get_total_cars方法内部,我们通过cls关键字引用当前类对象,从而可以访问到类属性total_cars。
现在,我们可以创建多个"Car"对象,并调用类方法:

car1 = Car("Toyota", "Corolla")
car2 = Car("Honda", "Civic")
car3 = Car("Ford", "Mustang")

print(Car.get_total_cars())  # 输出:3

在上面的代码中,我们创建了三个不同的"Car"对象,并通过调用类方法get_total_cars来获取当前已创建的汽车对象数目。输出结果为3,表示目前已经创建了3个Car对象。
需要注意的是,类方法可以通过类名直接调用,不需要创建对象实例。而且,无论是通过类名调用还是通过对象实例调用类方法,它们都能够访问和操作类级别的属性和方法。
类方法经常用于处理类级别的操作,例如计数器、类属性的访问和修改等。在汽车示例中,我们使用类方法get_total_cars来获取当前已创建的汽车对象数目,因为总车辆数是整个类共享的。

静态方法

静态方法是定义在类中的方法,静态方法是类中独立于对象实例和类的方法,由装饰器@staticmethod标记,与实例方法和类方法不同的是,静态方法不需要访问实例属性或类属性,它是一种独立于实例和类的方法。

class Car:
    def __init__(self, brand, model, distance, time):
        self.brand = brand
        self.model = model
        self.distance = distance
        self.time = time

    @staticmethod
    def calculate_average_speed(distance, time):
        return distance / time

    def get_info(self):
        print(f"Brand: {self.brand}")
        print(f"Model: {self.model}")
        print(f"Distance: {self.distance} km")
        print(f"Time: {self.time} hours")
        print(f"Average Speed: {self.calculate_average_speed(self.distance, self.time)} km/h")

car = Car("Toyota", "Corolla", 400, 5)
car.get_info()

在上面的代码中,我们定义了一个"Car"类,构造函数接收品牌、型号、行驶距离和所需时间这四个参数。然后,我们使用静态方法calculate_average_speed计算平均速度,即行驶距离除以所需时间。在get_info方法中,我们打印了汽车的品牌、型号、行驶距离、所需时间和平均速度(通过调用静态方法)。

运行上述代码,将得到如下输出:

Brand: Toyota
Model: Corolla
Distance: 400 km
Time: 5 hours
Average Speed: 80.0 km/h

从输出结果中可以看到,我们成功获取了汽车的信息并计算了平均速度。通过使用静态方法,我们将计算平均速度的逻辑封装在类中,使代码更加清晰和可维护。同时,静态方法可以直接通过类名调用,无需先创建汽车对象实例。
需要注意的是,静态方法可以在类中被所有实例共享,也可以被类自身直接调用。静态方法在不需要访问实例属性或类属性的情况下,提供了一种方便的方式来执行类相关的操作。

更多精彩内容,请关注同名公众:一点sir(alittle-sir)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UWB 技术及应用

超宽带技术为工业自动化提供独特优势,是首要的室内定位技术。 UWB 因其相对于 RFID、BLE 或 WiFi 等同类技术的众多优势而被认为是室内定位技术的黄金标准。它是基于位置的自动化的理想解决方案。 UWB 结合了短光速脉冲,可在宽带宽上精确测量信号到达时…

linux离线安装docker20.10.7 版本(亲测有效)

目录 1 下载2 安装2.1 新建docker.service2.2 为什么要写docker.service2.3 启动docker2.5 安装docker-compose2.5.1 为什么安装2.5.2 安装 3 /usr/local/bin/ 和 /usr/bin 区别 1 下载 将这个上传到linux 服务器的 随便一个目录 2 安装 解压离线安装包 tar -zxvf docker-20.1…

面试算法105:最大的岛屿

题目 海洋岛屿地图可以用由0、1组成的二维数组表示,水平或竖直方向相连的一组1表示一个岛屿,请计算最大的岛屿的面积(即岛屿中1的数目)。例如,在下图中有4个岛屿,其中最大的岛屿的面积为5。 分析 将岛屿…

局域网实现文件自动同步

软件下载地址: https://dbrwe.blog.csdn.net/article/details/132331206?spm1001.2014.3001.5502 打开【自动上传与同步】配置 在下面 自动同步 自动回传打上钩就可以同步或者下载文件

生成式人工智能市场规模、趋势和统计数据(2024-2026)

生成式人工智能市场规模、趋势和统计数据(2024-2026) 目录 生成式人工智能市场规模、趋势和统计数据(2024-2026)一、生成式人工智能行业亮点二、生成式人工智能市场规模三、生成式人工智能市场增长预测四、生成式人工智能采用统计…

结构型设计模式——适配器模式

适配器模式 这个更加好理解,就是做适配功能的类,例如,现在手机没有了圆形耳机接口,只有Type-C接口,因此你如果还想要使用圆形耳机的话需要买个圆形接口转Type-C的转换器(适配器),这…

再不收藏就晚了,Axure RP Pro 各版本大集合

Axure RP Pro下载链接 https://pan.baidu.com/s/1hRJRY6t0ZONKhdwvykAc3g?pwd0531 1.鼠标右击【Axure RP Pro9.0】压缩包(win11及以上系统需先点击“显示更多选项”)选择【解压到 Axure RP Pro9.0】。 2.打开解压后的文件夹,鼠标右击【Axu…

基于ssm的一家运动鞋店的产品推广网站的设计论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本一家运动鞋店就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

整理的十大算法和十大排序,分别用汇编语言,C语言,C++,java,python编写实现

整理的十大算法和十大排序,分别用汇编语言,C语言,C,java,python编写实现十大算法,分别用分别用C语言,C,java,python编写实现 Floyd Warshall算法 http://www.net188.com/thread-616-1-1.html …

<软考高项备考>《论文专题 - 57 干系人管理(1) 》

1 论文基础 1.1 写作要点 过程定义、作用写作要点、思路识别干系人识别干系人是定期识别项目干系人,分析和记录他们的利益、参与度、相互依赖性、影响力和对项目成功的潜在影响的过程。作用:使项目团队能够建立对每个干系人或干系人群体的适度关注。本项目里有哪些…

Qt之有趣的数字钟

一.效果 基于网络代码修改,支持时、分、秒;支持滑动、翻页和旋转。 二.实现 #include <QtCore> #include <QPainter> #include <QAction> #include <QWidget> #include <QMainWindow> #include <QTimer> #include <QKeyEvent> #…

TDengine 签约西电电力

近年来&#xff0c;随着云计算和物联网技术的迅猛发展&#xff0c;传统电力行业正朝着数字化、信息化和智能化的大趋势迈进。在传统业务基础上&#xff0c;电力行业构建了信息网络、通信网络和能源网络&#xff0c;致力于实现发电、输电、变电、配电和用电的实时智能联动。在这…

gem5学习(10):创建一个简单的配置脚本——Creating a simple configuration script

目录 一、gem5 configuration scripts 1、An aside on SimObjects 二、Creating a config file 1、导入m5库和SimObjects 2、创建模拟系统 3、设置系统时钟 4、设置内存模拟方式 5、创建CPU 6、创建系统级内存总线 7、连接请求-响应端口 &#xff08;1&#xff09;A…

Word2007导出PDF的正确做法

客户让做个一程序&#xff0c;从Excel读出数据&#xff0c;经过统计、计算生成PDF文档。我的做法是中间安装模板生成Word文档&#xff0c;然后在导出为PDF。 程序完成后需要测试&#xff0c;客户的环境是Win10Office2007。我用虚拟机搭建了环境&#xff0c;发现Word2007竟然无…

使用Nonebot编写QQ机器人

使用 NoneBot 这个工具&#xff0c;来编写 QQ 机器人。 安装基础软件 一、安装 NoneBot 库 直接使用 pip 安装即可 pip install nonebot二、安装酷Q 软件和 HTTP API 插件 酷Q 软件可以直接到官网下载&#xff0c;https://cqp.cc/b/news&#xff0c;或者可以到网盘下载&am…

理解接雨水算法

一、IDEA注释显示图片 在做题时&#xff0c;需要对照这图片&#xff0c;才能更好的梳理思路。 首先&#xff0c;注释里添加<img/>标签 之后&#xff0c;将鼠标光标放置在需要以阅读模式预览注释的地方&#xff0c;然后按快捷键CtrlAltQ即可 二、接雨水算法 先看接雨水…

nRF 5340环境搭建和工具下载(采用vscode最新搭建教程)

1. nRF 5340环境搭建和工具下载 1. 1 软件安装 nRF Connect for Desktop https://www.nordicsemi.com/Products/Development-tools/nrf-connect-for-desktop nRF Command Line Tools https://www.nordicsemi.com/Products/Development-tools/nrf-command-line-tools/downl…

使用Flask快速部署PyTorch模型

对于数据科学项目来说&#xff0c;我们一直都很关注模型的训练和表现&#xff0c;但是在实际工作中如何启动和运行我们的模型是模型上线的最后一步也是最重要的工作。 今天我将通过一个简单的案例&#xff1a;部署一个PyTorch图像分类模型&#xff0c;介绍这个最重要的步骤。 …

第三代量子计算机交付,中国芯片开辟新道路,光刻机难挡中国芯

日前安徽本源量子宣布第三代超导量子计算系统正式上线&#xff0c;这是中国最先进的量子计算机&#xff0c;计算量子比特已达到72个&#xff0c;在全球已居于较为领先的水平&#xff0c;这对于中国芯片在原来的硅基芯片受到光刻机阻碍无疑是巨大的鼓舞。 据悉本源量子的第一代、…

一个小巧、快速、轻量级的 .NET NoSQL 嵌入式数据库

前言 今天给大家分享一个小巧、快速、轻量级的 .NET NoSQL 嵌入式数据库&#xff1a;LiteDB。本篇文章主要是介绍LiteDB和在.NET中如何使用。 LiteDB介绍 LiteDB 是一个小巧、快速和轻量级的 .NET NoSQL 嵌入式数据库。 无服务器的 NoSQL 文档存储简单的 API&#xff0c;类似…