__new__
是实例对象真正的创建函数,在实例对象创建之前被调用,用于创建实例并返回该实例对象__init__
是实例对象的初始化函数,在实例对象创建完成后被调用,用于设置实例对象的初始化属性
区别 | __new__ |
__init__ |
---|---|---|
类型 | 静态方法,但不用使用 @staticmethod 装饰器显示声明 |
实例方法 |
参数 | 至少包含 cls ,代表当前类 |
至少包含 self ,代表当前实例 |
返回值 | 返回对象的实例 | 禁止返回任何值 |
调用顺序 | 在对象创建前调用 | 对象创建后初始化过程中调用 |
说明
- 如果
__new__
创建的是当前类的实例,会自动调用___init__
函数进行初始化,否则后面的__init__
函数不会被调用
1 | class A(object): |
牛客网上有关区别的一道题:
1 | __new__和__init__的区别,说法正确的是? ABCD |
使用自定义 __new__
函数对不可变类型(int, str, tuple)进行修改
1 | class AbsoluteValue(int): |
使用自定义 __new__
函数实现单例模式
1 | class Person(object): |