要在编程语言中创建一个类,有一个术语用于构造函数。在Python中,大家通常认为__init__是一种构造方法,其实并不完全一样。在构造类中,有一个特殊的方法__new__,可以等同于构造方法。
__new__ 是一个类方法。我们在定义类方法的时候,需要在函数前加上@classmethod装饰器,但是__new__是不需要的,因为已经做了特殊处理。为了理解__new__方法,我们先来看看什么是类方法。
类方法
class MyClass:
@classmethod
def test(cls):
print(cls.__name__)
MyClass.test()
#输出 MyClass
在 MyClass 类中,测试方法是一个类方法。它传入的第一个参数是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参数,也就是实例变量。这里返回父类(对象)的 __new__ 方法用于创建新实例。相当于
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
结合使用
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变量。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何用python绘制表格?09/16
- ♥ ==在python中是什么意思08/13
- ♥ 如何在python中找到带有max()的列表的最大值?09/14
- ♥ python中如何判断回文数09/04
- ♥ python如何调用js代码?11/30
- ♥ 如何在python中输入单引号10/26
内容反馈