在编程语言中创建一个类,有构造方法这样的一个术语。而在Python中,通常大家都认为__init__
是构造方法,其实并不完全等同。在构建类中,有一个特殊的方法__new__
,这个才能等同为构造方法。
__new__
是一个类方法,我们在定义一个类方法时需要在函数前打上@classmethod装饰器,而__new__
不需要,因为它经过特殊处理。为了理解__new__
方法,我们先来看看类方法是什么。
类方法
class MyClass:
@classmethod
def test(cls):
print(cls.__name__)
MyClass.test()
#输出 MyClass
在MyClass类中,test方法就是类方法,它传入第一个参数为cls,其实就是MyClass类,打印cls.__name__
可以看到结果。类方法可以直接 类名.方法名()调用。通常类方法是备选构造方法。
类方法的应用
>>> from datetime import datetime
>>> datetime.fromtimestamp(324234)
datetime.datetime(1970, 1, 5, 2, 3, 54)
如上所示,内置的datetime包中的fromtimestamp就是类方法,可以从多种方式构造出datetime对象。
__new__
方法
def __new__(cls, a):
return super().__new__(cls)
__new__
是类方法,所以第一个参数也是cls,剩下的参数就是构造方法里需要的参数了。通常__new__
都不需要定义,在元类编程中才需要,它可以控制类的生成过程。__new__
必须返回一个实例(instance),传入到__init__
方法中的self参数,也就是实例变量。这里返回父类(object)的__new__
方法用来创建一个新的实例。相当于
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
obj = object.__new__(MyClass)
obj = MyClass()
#obj是实例,上面两个方式等同
其中,MyClass是类,obj是实例(instance)
__init__
方法
__new__
是构造方法,那么__init__
就是初始化函数,它负责将变量绑定到实例中,更新实例的__dict__
字典。其中第一个参数self就是__new__
的返回值,是类的实例。__new__
方法先于__init__
方法执行
def __init__(self, a):
self.a = a
结合使用
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class MyClass:
def __new__(cls, a):
return super().__new__(cls)
def __init__(self, a):
self.a = a
obj = MyClass(3)
print(obj.a)
要点
1.__new__
是构造方法,__init__
是初始化函数。
2.__new__
通常不需要手动定义,一般在元类编程中使用,控制类的生成过程。
3.__new__
第一个被执行,然后执行__init__
绑定实例变量。
4.__new__
必须有返回值,返回值是该类的实例,它会被__init__
函数接收,通常叫做self变量