Python是一种面向对象的编程语言,即Python中的所有对象都是对象。 Python中有一种特殊的方法,称为魔术方法或dunder方法(这里的dunder表示“Double Underscores”)。 Python中的Dunder或magic方法是方法名称中带有两个前缀和后缀下划线的方法。这些通常用于操作员重载。魔术方法的几个示例是:__init__
,__add__
,__len__
,__repr__
等等
注意:要了解有关魔术方法的更多信息,请单击此处。
__new__方法
每当实例化一个类
__new__
和__init__
方法被调用。__new__
创建对象时将调用方法,并且__init__
方法将被调用以初始化对象。在基层object
,__new__方法定义为静态方法,需要传递参数cls
。cls
表示需要实例化的类,并且编译器在实例化时自动提供此参数。用法:
class class_name: def __new__(cls, *args, **kwargs): statements . . return super(class_name, cls).__new__(cls, *args, **kwargs)
注意:实例可以在里面创建__new__
通过使用super
函数或直接调用__new__
对象的方法,如果父类是对象的话。那是instance = super(MyClass, cls).__new__(cls, *args, **kwargs)
或者instance = object.__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 instance Init is called
上面的示例显示,调用类名时会自动调用__new__方法,而每次__new__方法返回该类的实例时,都会调用__init__方法,并将返回的实例作为__init__传递给__init__。self
参数,因此,即使您要将该实例全局/静态保存到某个位置,并且每次从__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 instance None
在上面的示例中,可以看出未调用__init__方法,并且实例化为None
因为构造函数没有返回任何东西。让我们看看如果__new__和__init__方法都返回了什么会发生什么。
# Python program to
# demonstrate __new__
class A(object):
# new method returning a string
def __new__(cls):
print("Creating instance")
return "GeeksforGeeks"
class B(object):
# init method returning a string
def __init__(self):
print("Initializing instance")
return "GeeksforGeeks"
print(A())
print(B())
输出:
Creating instance GeeksforGeeks Initializing instance
Traceback (most recent call last): File "/home/62216eb30d3856048eff916fb8d4c32d.py", line 17, inprint(B()) TypeError:__init__() should return None, not 'str'
调用__init__方法的处理程序会引发此TypeError,从__init__方法返回任何内容都没有任何意义,因为它的目的只是改变新创建实例的新鲜状态。
让我们尝试一个示例,其中__new__方法返回另一个类的实例。
例:
# Python program to
# demonstrate __new__ method
# class whose object
# is returned
class GeeksforGeeks(object):
def __str__(self):
return "GeeksforGeeks"
# class returning object
# of different class
class Geek(object):
def __new__(cls):
return GeeksforGeeks()
def __init__(self):
print("Inside init")
print(Geek())
输出:
GeeksforGeeks
相关用法
注:本文由纯净天空筛选整理自nikhilaggarwal3大神的英文原创作品 __new__ in Python。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。