在这个节课的开始,我们先回顾一下面向对象课程中学的构造函数__init__()
目录
一、__init__() 和 __new__()
1.1 __init__()
作用:初始化对象
eg:
class Test(object):
def __init__(self):
print("这是__init__()")
te = Test()
# 输出结果:这是__init__()
1.2 __new__()
__new__(): object 基类提供的内置的静态方法
作用:
1、在内存中为对象分配空间
2、返回对象的引用
eg:
class Test(object):
def __init__(self):
print("这是__init__()")
def __new__(cls, *args, **kwargs): # cls代表类本身
print("我是__new__()")
te = Test()
# 输出结果:我是__new__()
我们会发现,这里面的__init__方法没有输出 ,这是为什么呢?
其实是因为我们在__new__方法中将__new__方法改写了,改变了python中默认__new__的功能,改成了print("我是__new__()"),所以__init__方法没有输出
我们接下来试着打印一下te和cls
eg:没有__new__() 方法时
class Test(object):
def __init__(self):
print("这是__init__()")
te = Test()
print(te)
# 输出结果:
# 这是__init__()
# <__main__.Test object at 0x000001BF8ABFE148>
加入__new__() 方法时:
class Test(object):
def __init__(self):
print("这是__init__()")
def __new__(cls, *args, **kwargs):
print("我是__new__()")
print(cls)
te = Test()
print(te)
# 输出结果:
# 我是__new__()
# <class '__main__.Test'>
# None
发现此时te输出为None,就是因为__new__的功能被覆盖改写了
那么我们如果想修改原有的代码,却还想继承原有代码的功能,那么我们该怎么做呢?
我们需要用到之前学习的扩展
eg:
class Test(object):
def __init__(self):
print("这是__init__()")
def __new__(cls, *args, **kwargs):
print("我是__new__()")
print(cls)
# 对父类方法进行扩展 推荐使用super().方法名()
res = super().__new__(cls)
# 方法重写,res里面保存的是实例对象的引用,__new__()是静态方法,形参里面有cls,实参就必须传cls
return res
# 注意:重写__new__() 一定要return super().__new__(cls),否则python解释器得不到分配空间的对象引用,