第一阶段(7):魔术方法(__call__,__init__,__new__)

上一篇对__call__,方法做了解释下面我们来看下__init__和__new__方法

__init__方法(自行去了解把,哈哈哈)

略过~~~

__new__方法

废话不多说,先上结论

在Python中new方法与init方法类似,但是如果两个都存在那么new闲执行。

在基础类object中,new被定义成了一个静态方法,并且需要传递一个参数cls。
Cls表示需要实例化的类,此参数在实例化时由Python解析器自动提供。

new()是在新式类中新出现的方法,它作用在构造方法init()建造实例之前,可以这么理解,在Python 中存在于类里面的
构造方法init()负责将类的实例化,而在init()调用之前,new()决定是否要使用该init()方法,因为new会决定这个类是否分配内存

特性

new()方法是在类准备将自身实例化时调用。
new()方法始终都是类的静态方法,即使没有被加上静态方法装饰器;

代码实例1(分配内存)

class New_obj():
count=0
a=None
def __init__(self,a):
print('__init__')
# 内存分配只分配一次
def __new__(cls, *args, **kwargs):
if cls.count==0:
cls.a=super().__new__(cls)
print(cls.a)
print(args)
cls.count+=1
return cls.a
else:
print(args)
print(cls.a)
return cls.a
if __name__ == '__main__':
New_obj(1)
New_obj(2)
New_obj(3)

结果(内存地址都是一个)

 

 

 代码实例2(决定init执不执行)

class Person():
def __init__(self, name, age):
self.name = name
self.age = age
# 也可以先做判断 判断是否需要分配内存
def __new__(cls, name, age):
if 0 < age < 150:
return super().__new__(cls)
else:
return None
if __name__ == '__main__':
print(Person('Tom', 10))
print(Person('Mike', 200))

结果(看见没,第二个就没有执行)

 

 总结

使用new函数,来决定是否为多个类对象分配同一个内存地址即(return super().__new__(cls)),进而执行init方法,但是如果判断某个条件不满足,那我们完全可以

在new函数里 返回None,那么改类就不会继续执行

posted @ 2021-11-26 15:27  Tester-**  阅读(36)  评论(0编辑  收藏  举报