python class __new__、__init__、__call__ 区别
_new__:用于创建并返回一个新的实例,在实例化过程中最先被调用。__init__:用于初始化实例,在实例创建之后被调用。__call__:使实例可以像函数一样被调用。这三个方法分别负责不同阶段的操作,合理使用它们可以更好地控制类的行为和特性。
·
在Python中,__new__、__init__ 和 __call__ 是三个不同的特殊方法,它们在类的创建和调用过程中扮演着不同的角色。以下是它们的区别和用法:
1. __new__ 方法
- 作用:
__new__是一个静态方法,负责创建并返回一个新的实例。它是类的构造方法,通常用于定制类的实例化过程。 - 调用时机:在一个对象实例化时,
__new__最先被调用,它负责创建实例然后将其传递给__init__。 - 返回值:必须返回一个实例。
例子:
class MyClass:
def __new__(cls, *args, **kwargs):
print("Creating instance")
instance = super(MyClass, cls).__new__(cls)
return instance
def __init__(self, value):
print("Initializing instance")
self.value = value
obj = MyClass(10)
输出:
Creating instance
Initializing instance
2. __init__ 方法
- 作用:
__init__是一个实例方法,用于初始化实例。它不负责创建实例,而是在实例创建之后被调用,用于设置实例的初始状态。 - 调用时机:在对象实例创建后(即
__new__方法返回实例后),自动调用__init__方法。 - 返回值:没有返回值。
例子:
class MyClass:
def __init__(self, value):
print("Initializing instance")
self.value = value
obj = MyClass(10)
输出:
Initializing instance
3. __call__ 方法
- 作用:
__call__是一个实例方法,使得类的实例可以像函数一样被调用。 - 调用时机:当你对一个实例进行“调用”操作时,即使用圆括号
(),就会触发__call__方法。 - 返回值:可以有返回值,也可以没有,根据实现决定。
例子:
class MyClass:
def __init__(self, value):
self.value = value
def __call__(self, x):
print(f"Called instance with {x}, value is {self.value}")
return self.value + x
obj = MyClass(10)
result = obj(5) # 等同于 obj.__call__(5)
print(result)
输出:
Called instance with 5, value is 10
15
总结
__new__:用于创建并返回一个新的实例,在实例化过程中最先被调用。__init__:用于初始化实例,在实例创建之后被调用。__call__:使实例可以像函数一样被调用。
这三个方法分别负责不同阶段的操作,合理使用它们可以更好地控制类的行为和特性。
效果



更多推荐




所有评论(0)