关于python中的__init__与__new__以及__call__三个方法的简单介绍

这篇文章主要给大家介绍了关于python中__init__、__new__和__call__方法的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友可以参考学习,下面来跟着小编一起看看吧。

前言

本文主要给大家介绍关于python中__init__、__new__和__call__方法的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍:

任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建、初始化、使用、垃圾回收,不同的阶段由不同的方法(角色)负责执行。

定义一个类时,大家用得最多的就是 __init__ 方法,而 __new__ 和 __call__ 使用得比较少,这篇文章试图帮助大家把这3个方法的正确使用方式和应用场景分别解释一下。

立即学习“Python免费学习笔记(深入)”;

关于 Python 新式类和老式类在这篇文章不做过多讨论,因为老式类是 Python2 中的概念,现在基本没人再会去用老式类,新式类必须显示地继承 object,而 Python3 中,只有新式类,默认继承了 object,无需显示指定,本文代码都是基于 Python3 来讨论。

__init__方法

__init__方法负责对象的初始化,系统执行该方法前,其实该对象已经存在了,要不然初始化什么东西呢?先看例子:

# class A(object): python2 必须显示地继承objectclass A: def __init__(self):  print("__init__ ")  super(A, self).__init__() def __new__(cls):  print("__new__ ")  return super(A, cls).__new__(cls) def __call__(self): # 可以定义任意参数  print('__call__ ')A()

登录后复制

输出

__new____init__

登录后复制

从输出结果来看, __new__方法先被调用,返回一个实例对象,接着 __init__ 被调用。 __call__方法并没有被调用,这个我们放到最后说,先来说说前面两个方法,稍微改写成:

def __init__(self): print("__init__ ") print(self) super(A, self).__init__()def __new__(cls): print("__new__ ") self = super(A, cls).__new__(cls) print(self) return self

登录后复制

输出:

__new__ __init__ 

登录后复制

从输出结果来看,__new__ 方法的返回值就是类的实例对象,这个实例对象会传递给 __init__ 方法中定义的 self 参数,以便实例对象可以被正确地初始化。

如果 __new__ 方法不返回值(或者说返回 None)那么 __init__ 将不会得到调用,这个也说得通,因为实例对象都没创建出来,调用 init 也没什么意义,此外,Python 还规定,__init__ 只能返回 None 值,否则报错,这个留给大家去试。

__init__方法可以用来做一些初始化工作,比如给实例对象的状态进行初始化:

def __init__(self, a, b): self.a = a self.b = b super(A, self).__init__()

登录后复制

另外,__init__方法中除了self之外定义的参数,都将与__new__方法中除cls参数之外的参数是必须保持一致或者等效。

class B: def __init__(self, *args, **kwargs):  print("init", args, kwargs) def __new__(cls, *args, **kwargs):  print("new", args, kwargs)  return super().__new__(cls)B(1, 2, 3)# 输出new (1, 2, 3) {}init (1, 2, 3) {}

登录后复制

__new__ 方法

一般我们不会去重写该方法,除非你确切知道怎么做,什么时候你会去关心它呢,它作为构造函数用于创建对象,是一个工厂函数,专用于生产实例对象。著名的设计模式之一,单例模式,就可以通过此方法来实现。在自己写框架级的代码时,可能你会用到它,我们也可以从开源代码中找到它的应用场景,例如微型 Web 框架 Bootle 就用到了。

class BaseController(object): _singleton = None def __new__(cls, *a, **k):  if not cls._singleton:   cls._singleton = object.__new__(cls, *a, **k)  return cls._singleton

登录后复制

这段代码出自 https://github.com/bottlepy/bottle/blob/release-0.6/bottle.py

这就是通过 __new__ 方法是实现单例模式的的一种方式,如果实例对象存在了就直接返回该实例即可,如果还没有,那么就先创建一个实例,再返回。当然,实现单例模式的方法不只一种,Python之禅有说:

There should be one– and preferably only one –obvious way to do it.

用一种方法,最好是只有一种方法来做一件事

__call__ 方法

关于 __call__ 方法,不得不先提到一个概念,就是可调用对象(callable),我们平时自定义的函数、内置函数和类都属于可调用对象,但凡是可以把一对括号()应用到某个对象身上都可称之为可调用对象,判断对象是否为可调用对象可以用函数 callable

如果在类中实现了 __call__ 方法,那么实例对象也将成为一个可调用对象,我们回到最开始的那个例子:

a = A()print(callable(a)) # True

登录后复制

a是实例对象,同时还是可调用对象,那么我就可以像函数一样调用它。试试:

a() # __call__

登录后复制

很神奇不是,实例对象也可以像函数一样作为可调用对象来用,那么,这个特点在什么场景用得上呢?这个要结合类的特性来说,类可以记录数据(属性),而函数不行(闭包某种意义上也可行),利用这种特性可以实现基于类的装饰器,在类里面记录状态,比如,下面这个例子用于记录函数被调用的次数:

class Counter: def __init__(self, func):  self.func = func  self.count = 0 def __call__(self, *args, **kwargs):  self.count += 1  return self.func(*args, **kwargs)@Counterdef foo(): passfor i in range(10): foo()print(foo.count) # 10

登录后复制

在 Bottle 中也有 call 方法 的使用案例,另外,stackoverflow 也有一些关于 call 的实践例子,推荐看看,如果你的项目中,需要更加抽象化、框架代码,那么这些高级特性往往能发挥出它作用。

总结

以上就是关于python中的__init__与__new__以及__call__三个方法的简单介绍的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2267840.html

(0)
上一篇 2025年2月27日 10:17:27
下一篇 2025年2月23日 00:33:27

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 哪些计算机语言有指针

    以下计算机语言具有指针功能:1. C语言;2. C++语言;3. Java语言;4. Python语言(仅支持类似指针的功能);5. Assembly语言;6. Delphi;7. Go;8. Rust;9. Swift。 哪些计算机语言有…

    2025年2月27日
    000
  • cat计算机语言有哪些

    计算机语言是用于人机交互的人工语言。主要类型包括:低级语言:直接被计算机硬件理解的机器语言和更易读的汇编语言;中级语言:如用于科学计算的FORTRAN、用于数据处理的COBOL和用于人工智能的LISP;高级语言:广泛用于系统编程的C、面向对…

    2025年2月27日
    200
  • 量子计算机语言有哪些

    量子计算机语言使用专门的语言针对量子计算的独特特性来描述和操纵量子比特。这些语言包括:QASM:用于直接控制量子门和测量。Cirq:高级 Python 库,用于创建和操作量子电路。QuTils:Julia 库,用于量子态操作和可视化。Pen…

    2025年2月27日
    200
  • 常见计算机语言有哪些

    常见的计算机语言包括:Python(通用、易读)、Java(面向对象、“一次编写,随处运行”)、C++(中级、强大控制性)、JavaScript(客户端脚本,增强交互性)、C#(面向对象,易用性)、SQL(关系型数据库处理)、HTML/CS…

    2025年2月27日
    200
  • 测试计算机语言有哪些

    计算机语言是计算机与人类沟通的媒介,允许我们指定任务。计算机语言类型包括:机器语言:低级语言,由 0 和 1 组成,计算机直接理解。汇编语言:比机器语言高级,使用助记符。高级语言:人类可读,使用类似英语的结构。脚本语言:高级语言的子集,用于…

    2025年2月27日
    200
  • 推荐计算机语言有哪些

    推荐的计算机语言:Python:人工智能、机器学习Java:企业级应用程序、大型项目C++:游戏开发、操作系统C#:Windows 平台、游戏开发JavaScript:交互式网页、后端开发R:数据科学、统计分析Swift:苹果设备开发、移动…

    2025年2月27日
    200
  • 计算机语言文稿有哪些

    计算机语言文稿是指用计算机语言编写的文档,常见类型包括:源代码文稿:未编译的程序代码脚本文件:控制计算机的指令可执行文件:已编译的程序代码汇编语言文件:人类可读的代码,已翻译为机器可读的指令数据文件:存储结构化数据的集合(如 SQL、JSO…

    2025年2月27日
    200
  • 计算机语言示例有哪些

    计算机语言是人机沟通的桥梁,分为高级语言(如 Python、Java、C#、JavaScript)和低级语言(如汇编语言、机器语言)。选择合适的语言取决于用途、易用性、社区支持、性能和可移植性。 计算机语言示例 计算机语言是计算机系统与人类…

    2025年2月27日
    200
  • 新西兰计算机语言有哪些

    新西兰最常用的计算机语言包括:1. Python:高级语言,用于数据分析、机器学习和 Web 开发;2. Java:高级语言,用于企业应用和 Android 开发;3. C++:低级语言,用于高性能计算、游戏开发和操作系统;4. JavaS…

    2025年2月27日
    200
  • rescue计算机语言有哪些

    救援计算机语言用于处理计算机故障和安全问题,常见的选择包括:汇编语言:直接与硬件交互,提供对寄存器和内存的访问。机器语言:二进制指令,访问硬件全部功能,但难以理解和使用。C/C++:中级语言,提供高性能和低级内存控制。Python:高级脚本…

    2025年2月27日
    200

发表回复

登录后才能评论