二、类的实例方法与类的属性
2.1 类中的方法
2.1.1 类实例方法
类实例方法(Instance Method)是Python类中最常见的方法类型。它们与类的实例(对象)紧密相关,并且能够访问和修改实例的属性。
定义实例方法
- 实例方法至少有一个参数,通常命名为self,它代表类的当前实例。self参数是必需的,因为它允许方法访问和操作实例的属性。
class MyClass:
def __init__(self, value):
self.my_attribute = value
def instance_method(self, param):
# 使用self访问实例属性
self.my_attribute = param
# 方法体
...
调用实例方法
- 实例方法只能通过类的实例来调用:
# 创建类的实例
my_object = MyClass(value)
# 调用实例方法
my_object.instance_method(new_value)
2.1.2 类方法
类方法(Class Method)是Python类中的一种特殊方法,它可以通过类本身调用,而不是通过类的实例调用。类方法与类属性相关,而不是与实例属性相关。 定义类方法
- 类方法使用@classmethod装饰器来定义,并且至少有一个参数,通常命名为cls,代表类本身。cls参数是必需的,因为它允许方法访问和修改类的属性。
class MyClass:
class_attribute = "I am a class attribute"
def __init__(self, value):
self.instance_attribute = value
@classmethod
def class_method(cls, param):
# 使用cls访问类属性
cls.class_attribute = param
# 方法体
...
调用类方法
- 类方法可以直接通过类名来调用,不需要创建类的实例:
# 调用类方法
MyClass.class_method(new_value)
类方法的简单示例
class Currency:
conversion_rate = 1.1 # 假设这是美元到欧元的汇率
def __init__(self, amount):
self.amount = amount
@classmethod
def from_euros(cls, euros):
# 使用类方法将欧元转换为美元
dollars = euros * cls.conversion_rate
return cls(dollars)
# 使用类方法创建Currency实例
currency_instance = Currency.from_euros(50)
print(currency_instance.amount) # 输出: 55.0
2.1.3 类静态方法
静态方法(Static Method)在Python类中是一种特殊的方法,它不需要对类或实例的特定引用。这意味着静态方法在功能上与类之外的普通函数类似,但它们在类的命名空间内定义,这样可以在逻辑上组织代码,使得相关的方法和属性保持在一起。
定义静态方法
- 静态方法使用@staticmethod装饰器来定义。在方法定义上方添加这个装饰器,就可以将一个方法声明为静态方法。
class MyClass:
@staticmethod
def static_method(arg1, arg2, ...):
# 方法体
...
调用静态方法
- 可以通过以下两种方式调用静态方法:
1通过类名调用:
MyClass.static_method(arg1, arg2)
2通过实例调用(不推荐):
obj = MyClass()
obj.static_method(arg1, arg2)
通过实例调用(不推荐):
2.2 类的属性
类的属性
在Python程序中,属性是对类进行建模必不可少的内容。我们既可以在构造方法中定义属性,也可以在类中的其他方法中使用定义的属性。在Python中通常将属性分为类属性和实例属性两种:
- 类属性:是同一个类的所有实例所共有的,直接在类体中独立定义,引用格式为“类名.类变量名”,只要是某个实例对其进行了修改,就会影响这类所有其他的实例。
- 实例属性:同一个类的不同实例,其值是不相关联的,也不会互相影响,定义时格式为“属性名”,调用时也使用这个格式。
2.2.1 类属性
class Dog:
species = "Canis lupus familiaris" # 类属性,所有实例共享
2.2.2 实例属性
class Dog:
species = "Canis lupus familiaris" # 类属性,所有实例共享
def __init__(self, name, age):
self.name = name # 实例属性
self.age = age # 实例属性
2.3 处理银行账户简易的转账算法
class BankAccount:
def __init__(self, account_number, owner, balance=0.0):
"""
构造函数,用于初始化银行账户的属性
:param account_number: 账户号码
:param owner: 账户所有者姓名
:param balance: 账户余额,默认为0.0
"""
self.account_number = account_number # 账户号码
self.owner = owner # 账户所有者
self.balance = balance # 账户余额
def deposit(self, amount):
"""
存款方法,向账户中存入指定金额
:param amount: 存款金额
"""
if amount > 0:
self.balance += amount # 增加账户余额
print(f"{self.owner} 存款 {amount:.2f} 元。账户余额: {self.balance:.2f} 元")
else:
print("存款金额必须为正数。")
def withdraw(self, amount):
"""
取款方法,从账户中取出指定金额
:param amount: 取款金额
"""
if 0 < amount <= self.balance:
self.balance -= amount # 减少账户余额
print(f"{self.owner} 取款 {amount:.2f} 元。账户余额: {self.balance:.2f} 元")
else:
print("无效的取款金额。")
def get_balance(self):
"""
显示账户余额的方法
"""
print(f"账户 {self.account_number} ({self.owner}) 的余额是 {self.balance:.2f} 元")
def transfer(self, target_account, amount):
"""
转账方法,将指定金额从当前账户转账到另一个账户
:param target_account: 目标账户实例
:param amount: 转账金额
"""
if isinstance(target_account, BankAccount):
if 0 < amount <= self.balance:
self.withdraw(amount) # 从当前账户取款
target_account.deposit(amount) # 向目标账户存款
print(f"从 {self.owner} 账户向 {target_account.owner} 账户转账 {amount:.2f} 元。")
else:
print("无效的转账金额。")
else:
print("目标账户必须是一个 BankAccount 实例。")
# 创建两个BankAccount实例
account1 = BankAccount('12345', 'Alice', 1000.0)
account2 = BankAccount('67890', 'Bob', 500.0)
# 执行一些操作
account1.deposit(200.0) # Alice 存款 200 元
account1.withdraw(50.0) # Alice 取款 50 元
account1.get_balance() # Alice 查看余额
account1.transfer(account2, 100.0) # Alice 转账 100 元到 Bob 的账户
account2.get_balance() # Bob 查看余额
2.4 处理银行账户简易的转账算法(带类方法、静态方法、类属性)
class BankAccount:
# 类属性,用于存储所有账户的共同利率
interest_rate = 0.03 # 假设年利率为3%
def __init__(self, account_number, owner, balance=0.0):
"""
构造函数,用于初始化银行账户的属性
:param account_number: 账户号码
:param owner: 账户所有者姓名
:param balance: 账户余额,默认为0.0
"""
self.account_number = account_number # 账户号码
self.owner = owner # 账户所有者
self.balance = balance # 账户余额
def deposit(self, amount):
"""
存款方法,向账户中存入指定金额
:param amount: 存款金额
"""
if amount > 0:
self.balance += amount # 增加账户余额
print(f"{self.owner} 存款 {amount:.2f} 元。账户余额: {self.balance:.2f} 元")
else:
print("存款金额必须为正数。")
def withdraw(self, amount):
"""
取款方法,从账户中取出指定金额
:param amount: 取款金额
"""
if 0 < amount <= self.balance:
self.balance -= amount # 减少账户余额
print(f"{self.owner} 取款 {amount:.2f} 元。账户余额: {self.balance:.2f} 元")
else:
print("无效的取款金额。")
def get_balance(self):
"""
显示账户余额的方法
"""
print(f"账户 {self.account_number} ({self.owner}) 的余额是 {self.balance:.2f} 元")
def transfer(self, target_account, amount):
"""
转账方法,将指定金额从当前账户转账到另一个账户
:param target_account: 目标账户实例
:param amount: 转账金额
"""
if isinstance(target_account, BankAccount):
if 0 < amount <= self.balance:
self.withdraw(amount) # 从当前账户取款
target_account.deposit(amount) # 向目标账户存款
print(f"从 {self.owner} 账户向 {target_account.owner} 账户转账 {amount:.2f} 元。")
else:
print("无效的转账金额。")
else:
print("目标账户必须是一个 BankAccount 实例。")
# 类方法,用于获取当前利率
@classmethod
def get_interest_rate(cls):
"""
获取当前利率的类方法
:return: 当前利率
"""
return cls.interest_rate
# 类方法,用于设置新的利率
@classmethod
def set_interest_rate(cls, new_rate):
"""
设置新的利率的类方法
:param new_rate: 新的利率
"""
if new_rate >= 0:
cls.interest_rate = new_rate # 更新类属性
print(f"新的利率已设置为:{new_rate}")
else:
print("利率不能为负数。")
# 静态方法,用于计算利息
@staticmethod
def calculate_interest(balance, rate):
"""
计算利息的静态方法
:param balance: 账户余额
:param rate: 利率
:return: 利息
"""
return balance * rate # 利息计算公式
# 创建两个BankAccount实例
account1 = BankAccount('12345', 'Alice', 1000.0)
account2 = BankAccount('67890', 'Bob', 500.0)
# 执行一些操作
account1.deposit(200.0) # Alice 存款 200 元
account1.withdraw(50.0) # Alice 取款 50 元
account1.get_balance() # Alice 查看余额
account1.transfer(account2, 100.0) # Alice 转账 100 元到 Bob 的账户
account2.get_balance() # Bob 查看余额
# 使用类方法
print(f"当前利率:{BankAccount.get_interest_rate()}") # 输出当前利率
BankAccount.set_interest_rate(0.04) # 设置新的利率为4%
# 使用静态方法
interest = BankAccount.calculate_interest(account1.balance, BankAccount.get_interest_rate())
print(f"Alice账户的利息:{interest:.2f} 元") # 输出Alice账户的