__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__

参考

posted @ 2021-08-01 09:15  码上的生活  阅读(171)  评论(0编辑  收藏  举报