一、类
1.Python的__init__和__new__区别?
两者都是魔术方法,都是在特定的时候自动调用。
__init__初始化方法:
-
触发时机:实例化对象之后触发(实例化一个对象的时候有两个步骤:首先是造一个对象出来,然后再给这个对象初始化一下东西,这个init方法就是在初始化一些属性的时候触发的)。
-
作用:为对象添加对象的所属成员。
-
参数:一个self接受当前对象,其他的参数根据实例化的传参决定。
-
返回值:没有返回值
-
注意事项:没有
__init__方法里面的self,实例化的对象是谁,这个self就是对于谁的调用。
__new__构造方法:
-
触发时机:实例化对象的时候触发(实例化一个对象的时候有两个步骤:首先是造一个对象出来,然后再给这个对象初始化一下东西,这个new方法就是在造对象的时候触发的)。此时self都还没有出来,只有cls(类)。
-
作用:管理控制对象的生成过程。(可以控制这个对象到底是生成还是不生成)
-
参数:一个cls接受当前的类,其余都根据当前传参而定。
-
返回值:可有可无,没有返回值的话,实例化的结果就是None。
-
注意事项:new魔术方法和init方法的参数一致,除了第一个。
举个例子:
class Human:
# 这里做的实际上是重载object自带的__new__()
def __new__(cls,sex): # 这个cls就是类名
# 在这里就可以控制这个对象是否生成
# 如果这个的sex是女就生成这个对象,否则就不生成
if sex == '女':
object.__new__(cls) # 上帝之手创建这个对象
else:
# 不生成对象
return None
one = Human('女') # 这个对象可以生成
two = Human('男') # 不可以生成
__del__析构方法:
- 触发时机:对象被系统回收的时候触发,或者是使用del方法的时候触发。
- 作用:回收程序使用过程中的信息和变量等。
- 参数:一个self接收当前对象。
- 返回值:没有。
- 注意事项:没有。
未完待续。