当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python __new__用法及代码示例


Python是一种面向对象的编程语言,即Python中的所有对象都是对象。 Python中有一种特殊的方法,称为魔术方法或dunder方法(这里的dunder表示“Double Underscores”)。 Python中的Dunder或magic方法是方法名称中带有两个前缀和后缀下划线的方法。这些通常用于操作员重载。魔术方法的几个示例是:__init____add____len____repr__ 等等

注意:要了解有关魔术方法的更多信息,请单击此处。

__new__方法


每当实例化一个类__new__ __init__ 方法被调用。__new__ 创建对象时将调用方法,并且__init__ 方法将被调用以初始化对象。在基层object,__new__方法定义为静态方法,需要传递参数clscls 表示需要实例化的类,并且编译器在实例化时自动提供此参数。

用法:



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, 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 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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。