__new__ 和 __init__ 的区别
__new__
: 负责类对象创建,返回类对象(返回一个实例,可以是其它类的实例)
__init__
: 负责类对象的初始化,在对象创建之后调用. 也称为构造方法
两者都是内置的魔法函数
看一段代码
from keyword import iskeyword
from collections import abc
class FrozenJSON:
"""一个只读接口,使用属性表示法访问JSON类对象
"""
def __new__(cls, arg):
if isinstance(arg, abc.Mapping):
return super().__new__(cls)
elif isinstance(arg, abc.MutableSequence):
return [cls(item) for item in arg]
else:
return arg
def __init__(self, mapping):
self.__data = {}
for key, value in mapping.items():
if iskeyword(key):
key += '_'
self.__data[key] = value
def __getattr__(self, name):
if hasattr(self.__data, name):
return getattr(self.__data, name)
else:
return FrozenJSON(self.__data[name])
__new__
是类方法,第一个参数是类本身,余下的参数与__init__
方法一样,只不过没有 self- 默认的行为是委托给超类的
__new__
方法。这里调用的是 object 基类的__new__
方法,把唯一的参数设为 FrozenJSON。
简介
控制类初始化和构建过程,两个函数的参数有区别(cls、self), cls 代表类, self是对象自身.
如果__new__
函数返回一个已经存在的实例(不论是哪个类的),__init__
不会被调用
_new__
方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径(也就是 类创建过程)
__new__
- 如果没有返回值会怎么样?
- 单例模式
- 修改构建过程
__init__
- 初始化变量
调用顺序:
先调用__new__
,再__init__
参考
本文来自博客园,作者:码上的生活,转载请注明原文链接:https://www.cnblogs.com/zyl007/p/15085967.html