面向对象编程 (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)