Python入门 — 类

news2025/2/28 0:04:58

面向对象编程中,编写表示现实世界中的事物和情景的(class),并基于这些类来创建对象(object)。根据类来创建对象称为实例化,这样就可以使用类的实例(instance)

一、创建类

class Dog:
    def __init__(self, name, age):
        """初始化属性 name 和 age"""
        self.name = name
        self.age = age
    def sit(self):
        """模拟小狗收到命令时坐下"""
        print(f"{self.name} 坐下")
    def roll_over(self):
        """模拟小狗收到命令时打滚"""
        print(f"{self.name} 打滚")

Dog 类创建的每个实例都将存储名字和年龄,而且每条小狗都有坐下(sit())和打滚(roll_over())的能力。

       __init__() 方法:类中的函数称为方法,__init__() 是一个特殊方法,每当根据 Dog 类创建新实例时,Python 都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,可以避免 Python 默认方法与普通方法发生名称冲突。务必确保 __init__() 的两边都有两个下划线,否则当你使用类来创建实例时,将不会自动调用这个方法。

       __init__() 方法定义成包含三个形参:self、name 和 age。在这个方法的定义中,形参 self 必不可少,而且必须位于其他形参的前面

       当 Python 调用这个方法来创建 Dog 实例时,将自动传入实参 self。每个与实例相关联的方法调用都会自动传递实参 self,该实参是一个指向实例本身的引用,让实例能够访问类中的属性和方法。当我们创建 Dog 实例时,Python 将调用 Dog 类的 __init__() 方法。我们将通过实参向 Dog() 传递名字和年龄;self 则会自动传递,不需要我们来传递。

       在 __init__() 方法内定义的两个变量都有前缀 self 。以 self 为前缀的变量可供类中的所有方法使用,可以通过类的任意实例来访问。self.name = name 获取与形参 name 相关联的值,并将其赋给变量 name,然后该变量被关联到当前创建的实例。像这样可通过实例访问的变量称为属性。

       Dog 类还定义了另外两个方法:sit() 和 roll_over() 。由于这些方法执行时不需要额外的信息,因此只有一个形参 self。

二、创建实例

在上述创建类的基础上,我们可以根据类来创建类的实例

my_dog = Dog('LL', 3)

这样就创建好实例了,接下来可以使用它的方法和属性了。

1、访问属性

my_dog.age

2、调用方法

my_dog.sit()
my_dog.roll_over()

三、使用类和实例

1、创建时给定属性默认值

class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.meter = 0   # 默认为0

    def update_meter(self, mile):
        self.meter = mile

2、修改属性的值

修改属性的值主要有三种方法:通过实例修改,通过方法设置,以及通过方法递增(增加特定的值)。

实例修改:

my_car = Car('aaa', 'a8', 2025)
my_car.meter = 100

# 实例 my_car 中找到属性 meter,并将其值设置为 100

方法修改:

my_car = Car('aaa', 'a8', 2025)
my_car.update_meter(200)

属性的值递增修改:也是使用实例的方法进行修改,可以试试。

四、继承

       要编写的类是一个既有的类的特殊版本,可使用继承。当一个类继承另一个类时,将自动获得后者的所有属性和方法。原有的类称为父类,而新类称为子类。子类不仅继承了父类的所有属性和方法,还可定义自己的属性和方法。

1、子类的 __init__() 方法

        在既有的类的基础上编写新类,通常要调用父类的 __init__() 方法。这将初始化在父类的 __init__() 方法中定义的所有属性,从而让子类也可以使用这些属性。

class Car:
    def __init__(self, make, model, year):
        """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.meter = 0

    def get_descriptive_name(self):
        long_name = f"{self.year} {self.make} {self.model}"
        return long_name.title()

    def read_meter(self):
        print(f"这车开了 {self.meter} km")

    def update_meter(self, mile):
        if mile >= self.meter:
            self.meter = mile
        else:
            print("只能增加,不能减少的,孩子")

    def increment_meter(self, miles):
        self.meter += miles


class ElectricCar(Car):
    """电动汽车"""
    def __init__(self, make, model, year):
        """初始化父类的属性"""
        super().__init__(make, model, year)
        my_uu = ElectricCar('BYD', 'UU', 2025)
        print(my_uu.get_descriptive_name())

电动汽车是汽车的子类,具备 Car 类的所有功能。在定义子类时,必须在括号内指定父类的名称。__init__() 方法接受创建 Car 实例所需的信息,super() 是一个特殊的函数,让我们能够调用父类的方法。父类也称为超类

2、给子类定义属性和方法

class ElectricCar(Car):
    """电动汽车"""
    def __init__(self, make, model, year):
        """初始化父类的属性"""
        super().__init__(make, model, year)
        my_uu = ElectricCar('BYD', 'UU', 2025)
        print(my_uu.get_descriptive_name())
        # 新增属性
        self.battery_size = 40
        # 新增方法
    def describe_battery(self):
        print(f"电池容量为{self.battery_size}-kWh.")

3、重写父类中的方法

在子类中定义一个与要重写的父类方法同名的方法。这样,Python 将忽略这个父类方法,只关注在子类中定义的相应方法。

4、将实例用作属性

使用代码模拟实物时,你可能会发现自己给类添加了太多细节:属性和方法越来越多,文件越来越长。在这种情况下,可能需要将类的一部分提取出来,作为一个独立的类。将大型类拆分成多个协同工作的小类,这种方法称为组合。

class Car:
    #####


class Battery:
    def __init__(self, battery_size=75):
        """初始化电池的属性"""
        self.battery_size = battery_size

    def describe_battery(self):
        print(f"电池容量为-{self.battery_size}-kWh.")


class ElectricCar(Car):
    """电动汽车"""
    def __init__(self, make, model, year):
        """初始化父类的属性"""
        super().__init__(make, model, year)

        my_uu = ElectricCar('BYD', 'UU', 2025)
        print(my_uu.get_descriptive_name())

        self.battery = Battery()

       定义了一个名为 Battery 的新类,在 ElectricCar 类中,添加一个名为 self.battery 的属性。这行代码让Python 创建一个新的 Battery 实例。当 __init__() 方法被调用时,都将执行该操作,因此现在每个 ElectricCar 实例都包含一个自动创建的 Battery 实例。

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

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

相关文章

vscode/cursor+godot C#中使用socketIO

在 Visual Studio Code(VS Code)中安装 NuGet 包(例如SocketIOClient),你可以通过以下几种方法: 方法 1:使用dotnet cli 打开终端:在 VS Code 中按下Ctrl 或者通过菜单View -> Terminal打开终端。 导…

应用的负载均衡

概述 负载均衡(Load Balancing) 调度后方的多台机器,以统一的接口对外提供服务,承担此职责的技术组件被称为“负载均衡”。 负载均衡器将传入的请求分发到应用服务器和数据库等计算资源。负载均衡是计算机网络中一种用于优化资源利…

区块链仿真工具SimBlock使用

1. Environment requirements SimBlock 可以在 Windows、MacOS、Ubuntu Linux 或任何支持 Java 的 Unix 平台上运行。 它需要以下版本的 JDK 和 Gradle。 请注意,SimBlock 的仓库中包含 Gradle Wrapper,因此您也可以自动安装 Gradle(我们稍…

面试八股文--数据库基础知识总结(2) MySQL

本文介绍关于MySQL的相关面试知识 一、关系型数据库 1、定义 关系型数据库(Relational Database)是一种基于关系模型的数据库管理系统(DBMS),它将数据存储在表格(表)中,并通过表格…

江协科技/江科大-51单片机入门教程——P[1-3] 单片机及开发板介绍

前言:本节主要的任务是了解一下 51 单片机和所用的普中51开发板。 目录 一、单片机介绍 二、单片机的应用领域 三、STC89C52单片机 四、命名规则 五、单片机内部拆解 六、单片机内部结构图 七、单片机管脚图 八、单片机最小系统 九、开发板介绍 十、开发…

【Uniapp-Vue3】导入uni-id用户体系

在uniapp官网的uniCloud中下载uni-id用户体系 或者直接进入加载,下载地址:uni-id-pages - DCloud 插件市场 进入以后下载插件,打开HbuilderX 选中项目,点击确定 点击跳过 点击合并 右键uniCloud文件夹下的database文件夹&#x…

如何免费使用稳定的deepseek

0、背景: 在AI辅助工作中,除了使用cursor做编程外,使用deepseek R1进行问题分析、数据分析、代码分析效果非常好。现在我经常会去拿行业信息、遇到的问题等去咨询R1,也给了自己不少启示。但是由于官网稳定性很差,很多…

基于 ‌MySQL 数据库‌对三级视图(用户视图、DBA视图、内部视图)的详细解释

基于 ‌MySQL 数据库‌对三级视图(用户视图、DBA视图、内部视图)的详细解释,结合理论与实际操作说明: 一、三级视图核心概念 数据库的三级视图是 ANSI/SPARC 体系结构的核心思想,MySQL 的实现逻辑如下: …

easyexcel和poi同时存在版本问题,使用easyexcel导出excel设置日期格式

这两天在使用easyexcel导出excel的时候日期格式全都是字符串导致导出的excel列无法筛选 后来调整了一下终于弄好了,看一下最终效果 这里涉及到easyexcel和poi版本冲突的问题,一直没搞定,最后狠下心来把所有的都升级到了最新版,然…

取topN不同算法的实现的性能差别

背景 最近在实现一个需求,需要对大量数据中排序出前N,最暴力的方法肯定是直接全量排序。这里很明显是可以不用全量排序的,取前N,我们自然而然可以想到一个算法——堆排序。 一开始自己先写好了一版,后来想起&#xff…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.1.2典型应用场景:日志分析、实时搜索、推荐系统

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 为什么选择Elasticsearch?——典型应用场景深度解析1. 引言2. 日志分析:海量数据的实时洞察2.1 行业痛点2.2 ES解决方案关键技术实现: 2.…

Spring Cloud Alibaba学习 3- Sentinel入门使用

Spring Cloud Alibaba学习 3- Sentinel入门使用 中文文档参考:Sentinel中文文档 一. SpringCloud整合Sentinel 1.1 下载Sentinel-Dashboard Sentinel下载地址:Sentinel-Dashboard 到下载目录,cmd输入 java -jar sentinel-dashboard-1.8…

使用DeepSeek/chatgpt等AI工具辅助网络协议流量数据包分析

随着deepseek,chatgpt等大模型的能力越来越强大,本文将介绍一下deepseek等LLM在分数流量数据包这方面的能力。为需要借助LLM等大模型辅助分析流量数据包的同学提供参考,也了解一下目前是否有必要继续学习wireshark工具以及复杂的协议知识。 pcap格式 目…

C语言 --- 经典习题1

C语言 --- 经典习题1 第 一 题 - - - 交 换 两 个 整 数 的 值(四 种 方 法)第 二 题 - - - 最 大 公 约 数 和 最 小 公 倍 数 之 和总结 💻作者简介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 C 语 言 &#x1…

自定义mybatis拦截器,在springboot项目中不起作用的解决方法

自定义mybatis拦截器,在springboot项目中不起作用的解决方法 自定义mybatis拦截器,在若依springboot项目中不起作用的原因 找到 MyBatisConfig 配置类,引入自定义配置 在sqlSessionFactory中添加自定义拦截器,就可以正常使用了…

记录一下在k3s快速创建gitlab

废话不多说,直接上配置文件 需要修改的地方(备注都有写): 1.命名空间 namespace 2. claimName 文件挂载 Deployment kind: Deployment apiVersion: apps/v1 metadata:name: gitlabnamespace: cicd # 替换为您的命名空间la…

AWQ和GPTQ量化的区别

一、前言 本地化部署deepseek时发现,如果是量化版的deepseek,会节约很多的内容,然后一般有两种量化技术,那么这两种量化技术有什么区别呢? 二、量化技术对比 在模型量化领域,AWQ 和 GPTQ 是两种不同的量…

线性模型 - 支持向量机

支持向量机(SVM)是一种用于分类(和回归)的监督学习算法,其主要目标是找到一个最佳决策超平面,将数据点分为不同的类别,并且使得分类边界与最近的数据点之间的间隔(margin&#xff09…

湖北中医药大学谱度众合(武汉)生命科技有限公司研究生工作站揭牌

2025年2月11日,湖北中医药大学&谱度众合(武汉)生命科技有限公司研究生工作站揭牌仪式在武汉生物技术研究院一楼101会议室举行,湖北中医药大学研究生院院长刘娅教授、基础医学院院长孔明望教授、基础医学院赵敏教授、基础医学院…

面试基础---深入解析 AQS

深入解析 AQS:从源码到实践,剖析 ReentrantLock 和 Semaphore 的实现 引言 在 Java 并发编程中,AbstractQueuedSynchronizer(AQS)是一个核心框架,它为构建锁和其他同步器提供了基础支持。ReentrantLock 和…