类中,构造方法、普通方法、类方法、静态方法和魔术方法的区别

发布时间:2024年01月12日
class ExampleClass:
    class_variable = "I am a class variable"

    # 构造方法(Constructor)
    def __init__(self, instance_variable):
        self.instance_variable = instance_variable

    # 普通方法(Method)
    def instance_method(self):
        print(f"Instance method called with value: {self.instance_variable}")

    # 类方法(Class Method)
    @classmethod
    def class_method(cls):
        print(f"Class method called with class variable: {cls.class_variable}")

    # 静态方法(Static Method)
    @staticmethod
    def static_method():
        print("Static method called")

    # 魔术方法(Magic Methods
    def __str__(self):
        return f"ExampleClass instance with value: {self.instance_variable}"

# 创建类的实例
obj = ExampleClass("example")

# 调用实例方法
obj.instance_method()

# 调用类方法
ExampleClass.class_method()

# 调用静态方法
ExampleClass.static_method()

# 输出字符串表示
print(obj)
Instance method called with value: example
Class method called with class variable: I am a class variable
Static method called
ExampleClass instance with value: example

1、构造方法(Constructor):

  • 构造方法是在创建对象时自动调用的特殊方法。
  • 它的主要目的是用于初始化对象的属性或执行对象的一些必要设置。
  • 在Python中,构造方法的名称是 __init__,并且它始终在对象创建后立即调用。
  • 构造方法通常用于执行一些对象的初始化工作,例如设置实例变量的初始值。

2、普通方法(Method):

  • 普通方法是类中的普通函数,用于执行一些与对象相关的操作。
  • 它可以访问类的属性,并且可能修改对象的状态。
  • 普通方法没有特殊的名称,可以根据需要定义。

3、类方法(Class Method):

  • 类方法是用 @classmethod 装饰器修饰的方法。
  • 类方法的第一个参数是类本身,通常被命名为 cls
  • 类方法可以访问和修改类级别的属性,但不能访问实例级别的属性。

4、静态方法(Static Method):

  • 静态方法是用 @staticmethod 装饰器修饰的方法。
  • 静态方法与类和实例无关,不接收类或实例作为第一个参数。
  • 静态方法不能访问或修改类级别或实例级别的属性。

5、魔术方法(Magic Methods):

  • 魔术方法是以双下划线开头和结尾的方法,如 __init____str__ 等。
  • 这些方法在特定的情况下由解释器调用,用于执行特殊的操作。
  • 例如,__init__ 用于对象的初始化,__str__ 用于返回对象的字符串表示。

具体例子:

class BankAccount:
    bank_balance = 0

    def __init__(self, account_holder, initial_balance=0):
        self.account_holder = account_holder
        self.balance = initial_balance

    def deposit(self, amount):
        self.balance += amount
        print(f"{self.account_holder} deposited ${amount}. New balance: ${self.balance}")

    def withdraw(self, amount):
        if amount <= self.balance:
            self.balance -= amount
            print(f"{self.account_holder} withdrew ${amount}. New balance: ${self.balance}")
        else:
            print(f"Insufficient funds for {self.account_holder}. Balance: ${self.balance}")

    @classmethod
    def total_balance(cls):
        print(f"Total bank balance: ${cls.bank_balance}")

    @staticmethod
    def is_business_hours():
        # Assume business hours are from 9 AM to 5 PM
        current_hour = 15  # Just an example, should use current time in a real application
        return 9 <= current_hour <= 17

    def __str__(self):
        return f"Account Holder: {self.account_holder}, Balance: ${self.balance}"

# 创建账户实例
account1 = BankAccount("Alice", 1000)
account2 = BankAccount("Bob", 500)

# 存款和取款操作
account1.deposit(200)
account2.withdraw(100)

# 类方法 - 查看总余额
BankAccount.total_balance()

# 静态方法 - 检查是否是营业时间
print(f"Is it business hours? {'Yes' if BankAccount.is_business_hours() else 'No'}")

# 输出账户信息
print(account1)
print(account2)
  1. 构造方法 __init__

    • 作用: 用于初始化对象的属性,在对象创建时自动调用。
    • 参数: 接受 account_holder(账户持有人)和可选的 initial_balance(初始余额)作为参数。
    • 用法: 在创建账户实例时调用,设置账户的初始属性。
  2. 普通方法 depositwithdraw

    • 作用: 执行普通的实例级别操作,分别用于存款和取款。
    • 参数: amount 表示存款或取款的金额。
    • 用法: 被调用时会修改实例的 balance 属性,并输出相关信息。
  3. 类方法 total_balance

    • 作用: 访问和修改类级别的属性,这里用于查看所有账户的总余额。
    • 参数: cls(类本身)作为第一个参数。
    • 用法: 通过类名调用,可以访问和修改类级别的属性。
  4. 静态方法 is_business_hours

    • 作用: 与类和实例无关的操作,用于检查当前是否是营业时间。
    • 参数: 无参数,与类和实例无关。
    • 用法: 通过类名或实例名调用,不会访问实例级别的属性。
  5. 魔术方法 __str__

    • 作用: 定义对象的字符串表示形式,使对象能够以友好的方式呈现。
    • 参数: 无参数,除了 self 表示对象本身。
    • 用法:print 函数调用,返回对象的字符串表示。

????????总的来说,这五种方法在类中的作用和使用方式不同。构造方法用于初始化对象,普通方法用于实例级别的操作,类方法用于类级别的操作,静态方法与类和实例无关,而魔术方法用于定义对象的字符串表示。

结果:

# 这里current_hour(假设为15),实际运行时可能会得到不同的输出,具体取决于实际的运行时间。
Alice deposited $200. New balance: $1200
Bob withdrew $100. New balance: $400
Total bank balance: $0
Is it business hours? Yes
Account Holder: Alice, Balance: $1200
Account Holder: Bob, Balance: $400

结果分析:

  1. Alice 存入 $200,余额变为 $1200。
  2. Bob 取款 $100,余额变为 $400。
  3. total_balance 类方法被调用,输出总银行余额为 $0。
  4. is_business_hours 静态方法被调用,输出是否为营业时间(在这个例子中,假设是)。
  5. 打印出两个账户的信息,包括账户持有人和当前余额。
文章来源:https://blog.csdn.net/weixin_51659315/article/details/135467492
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。