【python】__call__,__new__,__init__

devtools/2024/10/15 20:13:58/

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 instancedef __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 = nameself.age = ageprint(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 instancedef __init__(self, name):print("Inside __init__")self.name = namedef __call__(self):print(f"Instance called with name: {self.name}")# 实例化类
obj = Example("Alice")
# 输出:
# Inside __new__
# Inside __init__# 像函数一样调用实例
obj()
# 输出: Instance called with name: Alice

http://www.ppmy.cn/devtools/126328.html

相关文章

mac os使用uniapp官网cli创建项目后,hbuilderx运行失败

这个故障发生前提是,m芯片的macos,采用arm64架构 npm i安装依赖的时候只安装了 esbuild/darwin-arm64rollup/rollup-darwin-arm64 但是hbx运行时会使用到 esbuild/darwin-x64rollup/rollup-darwin-x64 所以我们需要单独安装一下这两个依赖&#xff…

密码加密存储方案

在密码加密存储中,常用的方案包括 MD5、SHA-256 等哈希算法,同时结合一些额外的技术如加盐(Salt)和多次哈希来提高安全性。下面逐步介绍常见的密码加密存储方案、算法之间的区别、以及如何安全存储密码。 1. 基本的哈希算法&…

【含文档】基于Springboot+Vue的案件管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

基于ECS和NAS搭建个人网盘

前言 在数字化时代,数据已成为我们生活中不可或缺的一部分。个人文件、照片、视频等数据的积累,使得我们需要一个安全、可靠且便捷的存储解决方案。传统的物理存储设备(如硬盘、U盘)虽然方便,但存在易丢失、损坏和数据…

【工具分享】Amnesia勒索病毒解密工具

前言 Amnesia 勒索软件于 2017 年 4 月 26 日开始出现。Amnesia 主要通过 RDP(远程桌面服务)暴力攻击进行传播,允许恶意软件作者登录受害者的服务器并执行勒索行为。 特征 AES-256 加密算法对您的文件进行加密。加密后的文件会被重命名为 *…

蓝桥杯备赛(c/c++)

排序 9. 实现选择排序 10. 实现插入排序 11. 实现快速排序 12. 实现归并排序 13. 实现基数排序 14. 合并排序数组

9.校园二手网站系统( Springboot 和 thymeleaf(html)开源框架)

目录 1.系统的受众说明 2.系统需求分析 2.2.1用户功能模块 2.2.2二手交易功能需求 2.2.3需求发布功能需求 2.3.1操作流程 2.3.2添加信息流程 2.3.3删除信息流程 2.4 系统E-R图 3.系统概要设计 3.1系统的整体架构 3.2 数据库表 4.系统实现 4.1用户功能模块 4.2 二…

【氮化镓】低温对p-GaN HEMT迁移率、阈值电压和亚阈值摆幅的影响

本期分享一篇低温对p-GaN HEMT 迁移率、阈值电压和亚阈值摆幅影响进行表征和建模的研究论文。文章作者Shivendra Kumar Singh、Thien Sao Ngo、Tian-Li Wu(通讯作者)和Yogesh Singh Chauhan,分别来资源中国台湾阳明交通大学国际半导体技术学院、印度理工学院坎普尔分校电气工…