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)
相关推荐
crossoverJie7 分钟前
OpenAI 收购 Python 工具链 uv 和 Ruff
开发语言·人工智能·python·uv
2401_8318249610 分钟前
RESTful API设计最佳实践(Python版)
jvm·数据库·python
龙文浩_11 分钟前
AI / 机器学习 / 深度学习,它们的关系、核心流程、算法、任务、训练逻辑
人工智能·python·深度学习·神经网络·机器学习
NGC_661111 分钟前
深入理解 Java 线程池:从原理到实战
java·开发语言·python
研究点啥好呢11 分钟前
3月24日GitHub热门项目推荐|让AI无所不能
人工智能·python·开源·github
威联通安全存储12 分钟前
深度观察:跨越“存起来”的误区,智造时代如何重构工业数据底座?
大数据·人工智能·python·重构
摇滚侠12 分钟前
Spring Data Redis 主从集群 哨兵集群 分片集群 yml 配置
redis·python·spring
暮冬-  Gentle°12 分钟前
更优雅的测试:Pytest框架入门
jvm·数据库·python
人道领域13 分钟前
Day | 10【苍穹外卖:SpringTask 和WebSocket 案例】
java·数据库·后端