【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__()
中添加一些逻辑,确保对象在创建时具备正确的状态或执行必要的初始化操作。
三者的关系和区别
调用顺序:
__new__()
先被调用,用来创建类的实例;__init__()
在实例创建之后被调用,用来初始化实例;__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)!