自学内容网 自学内容网

【python】__call__,__new__,__init__

call()、new() 和 init() 是 Python 中常用的特殊方法,它们在对象的创建和使用过程中发挥着不同的作用。

1. call() 方法

功能
__call__() 是用来让一个类的实例像函数一样调用的。当定义了 __call__() 方法后,类的实例可以被当作函数来使用,并且直接调用该实例时,会执行这个方法。

用法:

class CallableClass:
    def __call__(self, *args, **kwargs):
        print(f"Called with args: {args}, kwargs: {kwargs}")

# 实例化类
instance = CallableClass()

# 像函数一样调用实例
instance(1, 2, a=3, b=4)  # 输出: Called with args: (1, 2), kwargs: {'a': 3, 'b': 4}

使用场景:
函数式接口:使类实例表现得像函数,适用于需要对实例进行多次调用的场景。
封装函数逻辑:用于将复杂的逻辑封装到类中,但依然保持函数式调用的风格。
回调函数:可以在某些设计模式中使用,尤其是需要动态调用的场景。

2. new() 方法

功能:

__new__() 是类的实例创建方法,它负责创建并返回一个新的实例。它通常是在实例创建之前调用的,比 __init__() 更早执行。__new__() 方法是一个静态方法,返回的是类的实例对象。

用法:

class MyClass:
    def __new__(cls, *args, **kwargs):
        print("Creating instance...")
        instance = super().__new__(cls)
        return instance

    def __init__(self, *args, **kwargs):
        print("Initializing instance...")

# 创建实例
obj = MyClass()
# 输出:
# Creating instance...
# Initializing instance...

注意:
__new__() 方法通常用在需要控制实例创建过程的场景,比如单例模式。
__new__() 方法必须返回一个类的实例(cls 的实例),否则 __init__() 不会被调用。

使用场景:
不可变类型的类: 比如 int、str 等类,在这些类的子类中如果需要自定义实例化行为,需要重写 __new__(),因为它们是不可变类型,__init__() 无法修改实例本身。
单例模式:__new__() 常用于控制类的实例化行为,确保只创建一个实例。

3. init() 方法

功能:
__init__() 是初始化方法,它负责在实例创建之后对实例进行初始化,设置初始状态或赋值操作。__init__() 不会返回任何值,它是实例创建后紧接着执行的。

用法:

class MyClass:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print(f"Initialized with name: {self.name}, age: {self.age}")

# 创建实例并初始化
obj = MyClass("Alice", 30)
# 输出: Initialized with name: Alice, age: 30

注意:
__init__() 方法是在对象创建完成后调用的,主要用于设置对象的初始状态。
__init__() 方法不需要返回值。

使用场景:
对象属性初始化__init__() 通常用于为实例设置初始属性值。
其他初始化逻辑:可以在 __init__() 中添加一些逻辑,确保对象在创建时具备正确的状态或执行必要的初始化操作。

三者的关系和区别

调用顺序:

  1. __new__() 先被调用,用来创建类的实例;
  2. __init__() 在实例创建之后被调用,用来初始化实例;
  3. __call__() 是在实例已经被创建并初始化后,当实例被当作函数调用时执行的。

功能不同:

__new__() 用于控制实例创建;
__init__() 用于初始化实例;
__call__() 用于让实例像函数一样调用。

返回值:

__new__() 必须返回一个实例对象;
__init__() 不返回值,只负责初始化实例;
__call__() 的返回值由开发者自行定义。

综合示例

class Example:
    def __new__(cls, *args, **kwargs):
        print("Inside __new__")
        instance = super().__new__(cls)
        return instance

    def __init__(self, name):
        print("Inside __init__")
        self.name = name

    def __call__(self):
        print(f"Instance called with name: {self.name}")

# 实例化类
obj = Example("Alice")
# 输出:
# Inside __new__
# Inside __init__

# 像函数一样调用实例
obj()
# 输出: Instance called with name: Alice


原文地址:https://blog.csdn.net/sazass/article/details/142958087

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!