在Python中的__new__用法详细介绍

  • __new__方法
目录python
是一种面向对象的编程语言, 即Python中的所有对象都是对象。 Python中有一种特殊的方法, 称为
魔术方法
or
【在Python中的__new__用法详细介绍】邓德方法
(此处的" dunder"表示"
双下划线
")。 Python中的Dunder或magic方法是方法名称中带有两个前缀和后缀下划线的方法。这些通常用于操作员重载。
魔术方法的几个示例是:
__在里面__
,
__加__
,
__len__
,
__repr__
等等
注意:进一步了解魔术方法点击这里.
__new__方法每当实例化一个类
__新__

__在里面__
方法被调用。
__新__
创建对象时将调用方法, 并且
__在里面__
方法将被调用以初始化对象。在基层
Object
, __new__方法定义为静态方法, 需要传递参数
cls
.
cls
表示需要实例化的类, 并且编译器在实例化时自动提供此参数。
语法如下:
class class_name:def __new__(cls, *args, **kwargs):statements..return super(class_name, cls).__new__(cls, *args, **kwargs)

注意:实例可以在里面创建__新__通过使用超功能或直接调用__新__对象的方法, 如果父类是对象的话。那是实例= super(MyClass, cls).__ new __(cls, * args, ** kwargs)or实例=对象.__ new __(cls, * args, ** kwargs)
如果类中同时存在__init__方法和__new__方法, 则将首先执行__new__方法并决定是否使用__init__方法, 因为其他类的构造函数可以由__new__方法调用, 或者可以简单地返回其他对象作为的实例。这个班。
例子:
# Python program to # demonstrate __new__# don't forget the object specified as base class A( object ): def __new__( cls ): print ( "Creating instance" ) return super (A, cls ).__new__( cls )def __init__( self ): print ( "Init is called" )A()

输出如下:
Creating instanceInit is called

上面的示例显示, 调用类名时会自动调用__new__方法, 而每次__new__方法返回该类的实例时, 都会调用__init__方法, 并将返回的实例作为__init__传递给__init__。自参数, 因此, 即使你要将该实例全局/静态保存在某个位置, 并且每次从__new__返回它, 那么每次执行此操作都会调用__init__。
这意味着, 如果__new__方法省略了super, 则__init__方法将不会执行。让我们看看是否是这种情况。
# Python program to # demonstrate __new__class A( object ): def __new__( cls ): print ( "Creating instance" )# It is not called def __init__( self ): print ( "Init is called" )print (A())

输出如下:
Creating instanceNone

在上面的示例中, 可以看出__在里面__方法未调用, 实例化被评估为None因为构造函数没有返回任何东西。让我们看看如果__new__和__init__方法都返回了什么会发生什么。
# Python program to # demonstrate __new__class A( object ): # new method returning a string def __new__( cls ): print ( "Creating instance" ) return "lsbin"class B( object ): # init method returning a string def __init__( self ): print ( "Initializing instance" ) return "lsbin"print (A()) print (B())

输出如下:
Creating instancelsbinInitializing instance

Traceback (most recent call last):File "/home/62216eb30d3856048eff916fb8d4c32d.py", line 17, in print(B())TypeError: __init__() should return None, not 'str'

调用__init__方法的处理程序会引发此TypeError, 从__init__方法返回任何内容都没有任何意义, 因为它的目的只是改变新创建实例的新鲜状态。
让我们尝试一个示例, 其中__new__方法返回另一个类的实例。
例子:
# Python program to # demonstrate __new__ method# class whose object # is returned class lsbin( object ): def __str__( self ): return "lsbin"# class returning object # of different class class Geek( object ): def __new__( cls ): return lsbin()def __init__( self ): print ( "Inside init" )print (Geek())

输出如下:
lsbin

注意怪胎!巩固你的基础Python编程基础课程和学习基础知识。
首先, 你的面试准备可通过以下方式增强你的数据结构概念:Python DS课程。

    推荐阅读