Python__new__方法

本文最后更新于:2022年12月17日 中午

python的__new__方法

什么是__new__方法

在Python中__new__方法与__init__方法类似,但是如果两个都存在那么__new__先执行。

__new__方法的返回值是

可以将类比作制造商,__new__方法就是前期的原材料购买环节,init方法就是在有原材料的基础上,加工,初始化商品环节。

实例:

class Person(object):
  
    def __init__(self, name, age):
        self.name = name
        self.age = age
     
    def __new__(cls, name, age):
        if 0 < age < 150:
            return object.__new__(cls)
            # return super(Person, cls).__new__(cls)
        else:
            return None
  
    def __str__(self):
        return '{0}({1})'.format(self.__class__.__name__, self.__dict__)
  
print(Person('Tom', 10))
print(Person('Mike', 200))

结果:

Person({'age': 10, 'name': 'Tom'})
None # 注意此时__init()__没被执行

执行过程:

  1. 当执行Person('Tom',10)时,实例化类,name='Tom',age='10'被当作参数带入__new__方法,参数cls表示需要实例化的类,即Person,这里由Python解析器自动提供.
  2. __new__方法会返回Person类的一个实例,通常是其父类new出来的实例,或者直接是object的new出来的实例。
  3. 然后利用这个实例来调用类的__init__方法,如果__new__方法返回None,则__init__方法不会被执行。

什么时候需要__new__

__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。还有就是实现自定义的metaclass

实例:
定义一个只能输出正数的整数类型:

class PositiveInteger(int):
    def __new__(cls, value):
        return super(PositiveInteger, cls).__new__(cls, abs(value))

i = PositiveInteger(-3)
print(i)
# 输出:3

Python__new__方法
http://yorick.love/2022/04/15/Python/Python__new__方法/
作者
Yorick
发布于
2022年4月15日
许可协议