友链提交
请认真填写以下信息,谢谢!

博客信息

HoshinoAi
(请填写完整的网址,例如:https://www.example.com)
(贵站展示本站链接的页面地址,一般是友链页面,填写后将自动验证友链关系有效性)
(用于抓取文章)
(用于接收通知)
菜单
本页目录

二、类的实例方法与类的属性

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账户的