Featured image of post Python中的__init__和__new__的功能和区别

Python中的__init__和__new__的功能和区别

一、Python中的 __init____new__ 方法简介

1.1 __init____new__ 方法功能简介

__init__ 方法,它是一个初始化方法,主要用于在创建对象后初始化该对象的属性; __new__ 方法,用于创建对象。

当在类中定义 __new__ 方法,__init__ 方法的时候,python首先调用 __new__ 方法来创建对象,然后再调用 __init__ 方法来初始化对象的属性

大多数程序语言中,只需要构造函数同时完成创建和初始化对象的方法,但是python却同时具有构造函数和初始化器。

例如下面的代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 定义了一个基类
class Name:
    # Created a __new__ method
    def __new__(cls):
        print(f'Called the __new__ method')
        return super(Name, cls).__new__(cls)

    # Created an __init__ method
    def __init__(self):
        print(f"Called the __init__ method")

# 创建一个对象

Name()

在上述代码中,在 Name类中定义了 __new__. 方法 和 __init__ 方法。__new__方法接受cls参数,该参数用于引用类,调用的时候,它会打印消息“Called the new method”信息。

紧接着,__init__ 方法会被调用,并且将实例传递给self参数。最后,再使用 Name() 语句调用 Name类时,将得到如下的输出结果:

1
2
3

Called the __new__ method
Called the __init__ method

从上述结果中可以知道类在初始化的时候,会先调用__new__方法,然后再调用__init__方法。

1.2 __new__ 方法

如下所示:

1
2
3
4
5
6
7
8

class  Reverse ( str ): 
    def  __new__ ( cls, sequence ): 
        return  super ().__new__(cls,sequence[::- 1 ]) 

seq = Reverse( "Python" ) 
print (seq)
# 输出 nohtyP

在上面的示例代码中,使用 __new__ 方法在实例化时自定义对象。此外,定义了继承自内置类型str的类Reverse,重写 __new__ 方法以在创建对象之前将sequence反转。

需要注意的是,这一功能无法使用 __init__ 实现,如果说,你尝试这样做,结果将是一个错误值。

1.3 __init__ 方法

__init__ 方法通常用于初始化对象的属性(带或不带默认值),举例如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class  Language : 
    def  __init__ ( self, lang= "Python" , Year= 1991 ): 
        self.lang = lang 
        self.year = 

    def  show ( self ): 
        print ( f'Language: {self.lang} | 创建: { self.year} .' ) 

language = Language() 
language.show()

在上面的代码中,定义了一个 Language类 和 __init__ 方法,它接受lang和year参数,默认值为"Python"和1991。

而当不带参数调用Language类的时候,__init__ 方法会将lang和year设置为其默认值。

二 总结

总的来说,python 中的类有构造函数和初始化方法的概念。__new__ 方法是构造函数方法,__init__ 方法则是初始化方法。

python首先会调用 __new__ 方法创建对象,然后再调用 __init__ 方法初始化对象属性。

Licensed under CC BY-NC-SA 4.0