当前位置: 首页 > news >正文

Python入门 — 类

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

一、创建类

class Dog:def __init__(self, name, age):"""初始化属性 name 和 age"""self.name = nameself.age = agedef 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 = makeself.model = modelself.year = yearself.meter = 0   # 默认为0def 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 = makeself.model = modelself.year = yearself.meter = 0def 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 = mileelse:print("只能增加,不能减少的,孩子")def increment_meter(self, miles):self.meter += milesclass 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_sizedef 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.lryc.cn/news/542869.html

相关文章:

  • R-INLA实现绿地与狐狸寄生虫数据空间建模:含BYM、SPDE模型及PC先验应用可视化...
  • Linux云计算SRE-第十五周
  • 2014年下半年试题一:论软件需求管理
  • podman加速器配置,harbor镜像仓库部署
  • 信息学奥赛一本通 1522:网络 | OpenJudge 百练 1144:Network
  • 本地部署DeepSeek的硬件配置建议
  • Redis面试题----Redis 的持久化机制是什么?各自的优缺点?
  • C#实现本地AI聊天功能(Deepseek R1及其他模型)。
  • Metal 学习笔记四:顶点函数
  • C# string转unicode字符
  • HITCON2017SSRFME-学习复盘
  • 【Http和Https区别】
  • 2025数学建模竞赛汇总,错过再等一年
  • 基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!
  • ReentrantLock 用法与源码剖析笔记
  • 矩阵的 正定(Positive Definite)与负定(Negative Definite):从Fisher信息矩阵看“曲率”的秘密
  • 被裁20240927 --- WSL-Ubuntu20.04安装cuda、cuDNN、tensorRT
  • uniapp写的h5跳转小程序
  • [SWPUCTF 2022 新生赛]ez_rce
  • 递归、搜索与回溯算法 —— 名词解析
  • 【docker】docker swarm lock和unlock的区别,以及旧节点重启的隐患
  • Grafana使用日志5--如何重置Grafana密码
  • ELK搭建初入
  • JVM 高级面试题及答案整理,最新面试题
  • 第9章:LangChain结构化输出-示例5(基于大模型如何精确匹配POJO的字段)
  • ref和reactive的区别 Vue3
  • 基于MATLAB的OFDM通信系统仿真设计
  • 地铁站内导航系统:基于蓝牙Beacon与AR技术的动态路径规划技术深度剖析
  • JS复习练习题目、完整nodejs项目以及Commons、Es
  • Linux:理解O(1)调度算法的设计精髓