Python(八)类(1)

面向对象编程 (object-oriented programming,OOP)是最有效的软件编写方法之一。在面向对象编程中,你编写表示现实世界中的事物和情景的 (class),并基于这些类来创建对象 (object)。根据类来创建对象称为实例化 ,这让你能够使用类的实例(instance)。

一、创建和使用类

下面我们来创建一个表示小狗的简单类Dog,根据Dog类创建的每个实例都将存储名字和年龄,而且我们会赋予每条小狗坐下(sit())和打滚(roll_over())的能力:

python 复制代码
class Dog:
    def __init__(self, name, age):
        # 初始化属性name和age
        self.name = name
        self.age = age
    def sit(self):
        print(self.name," sit")
    def roll_over(self):
        print(self.name," roll over")

1、__init __()方法

类中的函数称为方法。__init __()是一个特殊方法,每当你根据Dog类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。

当Python调用这个方法来创建Dog实例时,将自动传入实参self。每个与实例相关联的方法调用都会自动传递实参self,该实参是一个指向实例本身的引用,让实例能够访问类中的属性和方法。每当我们根据Dog类创建实例时,都只需给最后两个形参(name和age)提供值。

在该方法内定义的两个变量都有前缀self。以self为前缀的变量可供类中的所有方法使用,可以通过类的任意实例来访问。像这样可通过实例访问的变量称为属性(attribute)。

2、根据类创建实例

下面创建一个表示特定小狗的实例:

python 复制代码
my_dog = Dog("Lizi", 2)
print("My dog`s name is ", my_dog.name)
print("My dog is ", my_dog.age)

通常可以认为首字母大写的名称指的是类,而全小写的名称指的是根据类创建的实例。

(1)访问属性

要访问实例的属性,可使用点号。

python 复制代码
my_dog.name

输出有关my_dog的信息:

(2)调用方法

根据Dog类创建实例后,就能使用点号来调用Dog类中定义的任何方法了。

python 复制代码
my_dog = Dog("Lizi", 2)
my_dog.sit()
my_dog.roll_over()

要调用方法,需指定实例名和想调用的方法,并用句点分隔。

二、使用类和实例

下面编写一个汽车类Car,它存储了有关汽车的信息。

python 复制代码
class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
    def getName(self):
        long_name = f"{self.year} {self.make} {self.model}"
        return long_name.title()

my_car = Car("audi", "a6", 2025)
print(my_car.getName())

1、给属性指定默认值

有些属性无需通过形参来定义,可以在__init __()方法中为其指定默认值。下面添加一个odemeter的属性,其初始值总是为0。再添加一个read_odemeter()的方法,用于读取汽车的里程表:

python 复制代码
class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odemeter=0
    def getName(self):
        long_name = f"{self.year} {self.make} {self.model}"
        return long_name.title()
    def read_odemeter(self):
        print("Odemeter is", self.odemeter)

my_car = Car("audi", "a6", 2025)
print(my_car.getName())
my_car.read_odemeter()

2、修改属性的值

可以用三种不同的方式修改属性的值:直接通过实例修改,通过方法设置,以及通过方法递增(增加特定的值)。

(1)直接修改属性的值

要修改属性的值,最简单的方式是通过实例直接访问它。下面将里程表的值修改为23:

python 复制代码
my_car = Car("audi", "a6", 2025)
print(my_car.getName())
my_car.odemeter=23
my_car.read_odemeter()

输出为:

但有时候需要编写方法来更新属性。

(2)通过方法修改属性的值

下面演示一个名为update_odemeter()的方法:

python 复制代码
class Car:
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odemeter=0
    def getName(self):
        long_name = f"{self.year} {self.make} {self.model}"
        return long_name.title()
    def read_odemeter(self):
        print("Odemeter is", self.odemeter)
    def update_odemeter(self,mileage):
        self.odemeter = mileage

my_car = Car("audi", "a6", 2025)
print(my_car.getName())
my_car.update_odemeter(23)
my_car.read_odemeter()

添加update_odemeter()方法,方法接受一个里程值,并赋给self.odemeter。

(3)通过方法让属性的值递增

将属性值递增特定的量,而不是将其设置为全新的值。

python 复制代码
def update_odemeter(self,mileage):
    self.odemeter += mileage
    
my_car.update_odemeter(100)
相关推荐
架构精进之路6 分钟前
Deepseek 这么厉害,普通人怎么用好它?
后端·langchain·ai编程
weixin_307779138 分钟前
Python Pandas实现导出两个Excel数据集的分组记录数分析
开发语言·python·pandas
陌漠ardently21 分钟前
正则表达式和excel文件保存(python)
python·mysql·excel
2303_Alpha23 分钟前
深度学习入门:神经网络的学习
人工智能·python·深度学习·神经网络·学习·机器学习
Q1860000000027 分钟前
如何把pdf的内容转化成结构化数据进行存储到mysql数据库
数据库·python·mysql·pdf
uhakadotcom44 分钟前
BentoML远程代码执行漏洞(CVE-2025-27520)详解与防护指南
后端·算法·面试
_x_w1 小时前
【16】数据结构之基于树的排序算法篇章
开发语言·数据结构·python·算法·链表·排序算法
JavaEdge在掘金1 小时前
告别 Webpack 困惑:一文读懂配置、Loaders 与高效开发流程
python
xmyLydia1 小时前
我做了一个代码生成器:Spring Boot + Angular 全自动构建
后端
攻城狮7号1 小时前
Python爬虫第14节-如何爬取Ajax的数据
爬虫·python·python爬虫