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)
相关推荐
0思必得07 小时前
[Web自动化] Selenium基础介绍
前端·python·selenium·自动化·web自动化
秋饼7 小时前
【手撕 @EnableAsync:揭秘 SpringBoot @Enable 注解的魔法开关】
java·spring boot·后端
IT_陈寒7 小时前
Python 3.12 新特性实战:这5个改进让我的开发效率提升40%
前端·人工智能·后端
利兄的视界7 小时前
一步到位:M4 芯片 Mac 安装 PostgreSQL 16 并适配 pgvector 教程
后端·postgresql
GZKING7 小时前
ThinkPHP 8 报错"think\model\pivot" not found
后端
2501_931162437 小时前
大疆相机:空中影像新境界
python
测试19987 小时前
Web自动化测试入门
自动化测试·软件测试·python·功能测试·selenium·测试工具·测试用例
予枫的编程笔记7 小时前
【论文解读】DLF:以语言为核心的多模态情感分析新范式 (AAAI 2025)
人工智能·python·算法·机器学习
Smoothzjc7 小时前
👉 求你了,别再裸写 fetch 做 AI 流式响应了!90% 的人都在踩这个坑
前端·人工智能·后端
lbb 小魔仙7 小时前
【Python】零基础学 Python 爬虫:从原理到反爬,构建企业级爬虫系统
开发语言·爬虫·python