软件测试基础十四(python 类与对象)
类与对象的意义
- 面向对象编程的基础
-
- 模拟现实世界:在Python中,类和对象是面向对象编程(OOP)的核心概念。类就像是制造对象的蓝图或者模板,它定义了对象的属性(数据成员)和方法(函数成员)。例如,我们可以定义一个
Car
类来模拟汽车:
- 模拟现实世界:在Python中,类和对象是面向对象编程(OOP)的核心概念。类就像是制造对象的蓝图或者模板,它定义了对象的属性(数据成员)和方法(函数成员)。例如,我们可以定义一个
class Car:def __init__(self, brand, model, year):self.brand = brandself.model = modelself.year = yeardef start_engine(self):print(f"{self.brand} {self.model}的发动机启动了。")
-
-
- 这里的
Car
类有三个属性(brand
、model
和year
)和一个方法(start_engine
)。__init__
是一个特殊的方法,用于初始化对象的属性。
- 这里的
-
-
- 对象是类的实例化:对象是根据类创建出来的具体实例,就像根据汽车蓝图制造出的实际汽车。我们可以通过以下方式创建
Car
类的对象:
- 对象是类的实例化:对象是根据类创建出来的具体实例,就像根据汽车蓝图制造出的实际汽车。我们可以通过以下方式创建
my_car = Car("Toyota", "Corolla", 2022)
my_car.start_engine()
-
-
- 这里
my_car
是Car
类的一个对象,它有自己的品牌、型号和生产年份属性,并且可以调用start_engine
方法来模拟发动机启动。这种方式使得代码能够更贴近现实世界的概念,方便对复杂的实体进行建模。
- 这里
-
- 代码组织和复用
-
- 封装数据和行为:类将数据(属性)和操作数据的函数(方法)封装在一起,使得代码更加模块化。例如,对于一个银行账户类
BankAccount
,可以将账户余额、账户号码等数据和存款、取款等操作封装在一个类中:
- 封装数据和行为:类将数据(属性)和操作数据的函数(方法)封装在一起,使得代码更加模块化。例如,对于一个银行账户类
class BankAccount:def __init__(self, account_number, balance):self.account_number = account_numberself.balance = balancedef deposit(self, amount):self.balance += amountprint(f"已存入{amount}元,当前余额为{self.balance}元。")def withdraw(self, amount):if self.balance >= amount:self.balance -= amountprint(f"已取出{amount}元,当前余额为{self.balance}元。")else:print("余额不足。")
-
-
- 这样,通过
BankAccount
类的对象,就可以方便地管理银行账户的相关操作,并且数据和操作被封装在类内部,外部代码无法直接访问和修改账户余额,提高了数据的安全性和代码的可维护性。
- 这样,通过
-
-
- 代码复用:类可以被多次实例化,创建多个对象,从而实现代码的复用。例如,如果需要管理多个银行账户,只需要创建多个
BankAccount
类的对象即可:
- 代码复用:类可以被多次实例化,创建多个对象,从而实现代码的复用。例如,如果需要管理多个银行账户,只需要创建多个
account1 = BankAccount("123456789", 1000)
account2 = BankAccount("987654321", 2000)
account1.deposit(500)
account2.withdraw(300)
-
-
- 每个对象都有自己独立的属性和行为,这种复用方式大大提高了代码编写的效率,减少了重复代码。
-
- 继承与多态性
-
- 继承关系:Python中的类支持继承,子类可以继承父类的属性和方法,并且可以添加自己的新属性和方法或者重写父类的方法。例如,定义一个
SavingsAccount
类作为BankAccount
类的子类,用于表示储蓄账户:
- 继承关系:Python中的类支持继承,子类可以继承父类的属性和方法,并且可以添加自己的新属性和方法或者重写父类的方法。例如,定义一个
class SavingsAccount(BankAccount):def __init__(self, account_number, balance, interest_rate):super().__init__(account_number, balance)self.interest_rate = interest_ratedef calculate_interest(self):interest = self.balance * self.interest_rateself.deposit(interest)print(f"已计算利息{interest}元,当前余额为{self.balance}元。")
-
-
- 在这里,
SavingsAccount
类继承了BankAccount
类的属性和方法,同时添加了自己的interest_rate
属性和calculate_interest
方法。通过继承,可以在已有类的基础上快速创建新的类,实现代码的复用和扩展。
- 在这里,
-
-
- 多态性:多态性是指不同的类(通常是有继承关系的类)可以对相同的方法调用做出不同的响应。例如,假设有一个函数
process_account
,它接受一个BankAccount
类型的对象作为参数:
- 多态性:多态性是指不同的类(通常是有继承关系的类)可以对相同的方法调用做出不同的响应。例如,假设有一个函数
def process_account(account):account.deposit(100)
-
-
- 这个函数可以接受
BankAccount
类或者它的子类(如SavingsAccount
)的对象作为参数。当传入不同类型的对象时,deposit
方法会根据对象所属的类的具体实现来执行相应的操作,这就是多态性的体现。这种特性使得代码更加灵活和可扩展,可以方便地处理不同类型但具有相似行为的对象。
- 这个函数可以接受
-
类与对象
一、类与对象(面向对象)的概念
- 类(Class):
-
- 类是一种抽象的概念,它定义了具有相同属性和行为的一组对象的模板或蓝图。可以把类看作是一个模具,用它可以创建出多个具体的实例(对象)。
- 例如,定义一个“汽车”类,它可以包含属性如颜色、品牌、速度等,以及行为如加速、刹车、转弯等。
- 对象(Object):
-
- 对象是类的具体实例。通过类创建对象的过程称为实例化。每个对象都有自己独立的状态(属性值),但共享类定义的行为(方法)。
- 例如,根据“汽车”类可以创建出多个具体的汽车对象,每辆汽车都有自己特定的颜色、品牌和速度等属性值。
二、class
关键字的使用语法
- 定义类:
-
- 使用
class
关键字后跟类名来定义一个类。类名通常采用首字母大写的命名风格(PascalCase)。 - 例如:
- 使用
class Car:pass
-
- 这里定义了一个名为
Car
的空类。
- 这里定义了一个名为
- 类的内容:
-
- 类可以包含属性和方法。属性是描述对象状态的数据,方法是定义对象行为的函数。
- 例如:
class Car:def __init__(self, color, brand):self.color = colorself.brand = branddef accelerate(self):print("The car is accelerating.")
-
- 这个
Car
类有一个构造方法__init__
用于初始化对象的属性,还有一个方法accelerate
表示汽车加速的行为。
- 这个
三、什么是方法
- 定义:
-
- 方法是定义在类中的函数,用于描述对象的行为。方法可以访问和修改对象的属性,以及与其他对象进行交互。
- 调用方法:
-
- 通过对象来调用方法,使用点号(
.
)运算符。 - 例如:
- 通过对象来调用方法,使用点号(
my_car = Car("red", "Toyota")
my_car.accelerate()
-
- 这里首先创建了一个
Car
对象my_car
,然后调用了它的accelerate
方法。
- 这里首先创建了一个
四、什么是属性
- 定义:
-
- 属性是描述对象状态的数据。属性可以是实例属性(每个对象独立拥有)或类属性(所有对象共享)。
- 实例属性:
-
- 在构造方法
__init__
中定义的属性通常是实例属性。每个对象都有自己独立的实例属性值。 - 例如:
- 在构造方法
class Car:def __init__(self, color, brand):self.color = colorself.brand = brand
-
- 这里的
color
和brand
是实例属性。
- 这里的
- 类属性:
-
- 在类中直接定义的属性是类属性。所有对象共享同一个类属性值。
- 例如:
class Car:wheels = 4def __init__(self, color, brand):self.color = colorself.brand = brand
-
- 这里的
wheels
是类属性,表示所有汽车都有四个轮子。
- 这里的
五、__init__
方法的使用
- 构造方法:
-
__init__
方法是类的特殊方法,也称为构造方法。当创建一个对象时,这个方法会自动被调用,用于初始化对象的属性。
- 参数和
self
:
-
__init__
方法的第一个参数必须是self
,它代表对象本身。其他参数用于接收创建对象时传递的初始值。- 例如:
class Car:def __init__(self, color, brand):self.color = colorself.brand = brand
-
- 这里的
color
和brand
是构造方法的参数,用于初始化对象的color
和brand
属性。
- 这里的
六、__del__
方法的使用
- 析构方法:
-
__del__
方法是类的另一个特殊方法,也称为析构方法。当对象被销毁时,这个方法会自动被调用。
- 用途:
-
- 通常用于释放对象占用的资源,如关闭文件、断开数据库连接等。
- 例如:
class FileHandler:def __init__(self, filename):self.filename = filenameself.file = open(filename, 'r')def __del__(self):if self.file:self.file.close()
-
- 这个类用于处理文件,在构造方法中打开文件,在析构方法中确保文件被关闭。
七、__str__
方法的使用
- 字符串表示方法:
-
__str__
方法用于返回对象的字符串表示形式。当使用print()
函数或str()
函数对对象进行操作时,会自动调用这个方法。
- 自定义字符串表示:
-
- 可以在类中定义
__str__
方法来返回一个有意义的字符串,以便更好地理解对象的状态。 - 例如:
- 可以在类中定义
class Car:def __init__(self, color, brand):self.color = colorself.brand = branddef __str__(self):return f"{self.color} {self.brand} car"
-
- 这里定义了
__str__
方法,使得当打印一个Car
对象时,会输出其颜色和品牌的描述。
- 这里定义了
总之,理解类与对象、掌握class
关键字的使用、了解方法和属性的定义以及特殊方法的作用,是 Python 面向对象编程的基础。这些概念可以帮助你组织和管理代码,提高代码的可维护性和可扩展性。