python内建方法new的使用

40次阅读

共计 733 个字符,预计需要花费 2 分钟才能阅读完成。

__new__() 方法和__init__() 方法的区别

__new__() 方法需要有返回值,__init__() 不需要返回值

实质区别是 new() 需要返回父类或者说超类的 new() 后的结果,init() 返回一个 None, 不需要手动 return

__new__() 方法需要有返回值

__new__() 方法在类和元类中用法的区别

在类中使用__new__() 方法

这里说的类的普通类

class Spider:
    i = 0

    def __new__(cls, *args, **kwargs):
        print('cls.i >', cls.i)
        cls.i += 1
        return super().__new__(cls, *args, **kwargs)

    def __init__(self):
        print('self.i >', self.i)


Spider()
Spider()
Spider()

输出如下

cls.i > 0
self.i > 1
cls.i > 1
self.i > 2
cls.i > 2
self.i > 3

在普通类中使用 new 的第一个参数是 cls,而 init 的第一个参数是 self

  1. cls 表示当前类
  2. self 表示当前实例

在元类中使用__new__() 方法

元类有如下定义方式

class Single(object):
    _instance = None

    def __new__(cls, *args, **kw):
        if cls._instance is None:
            cls._instance = object.__new__(cls, *args, **kw)
        return cls._instance

    def __init__(self):
        pass


single1 = Single()
single2 = Single()

print(id(single1) == id(single2))

输出如下

True

正文完
 0