Python 中__new__方法詳解及使用

pythontab發表於2018-11-06

__new__ 的作用

在Python中__new__方法與__init__方法類似,但是如果兩個都存在那麼__new__閒執行。

在基礎類object中,__new__被定義成了一個靜態方法,並且需要傳遞一個引數cls。Cls表示需要例項化的類,此引數在例項化時由Python解析器自動提供。

new()是在新式類中新出現的方法,它作用在構造方法init()建造例項之前,可以這麼理解,在Python 中存在於類裡面的構造方法init()負責將類的例項化,而在init()呼叫之前,new()決定是否要使用該init()方法,因為new()可以呼叫其他類的構造方法或者直接返回別的物件來作為本類 的例項。

new()方法的特性:

new()方法是在類準備將自身例項化時呼叫。

new()方法始終都是類的靜態方法,即使沒有被加上靜態方法裝飾器。

例項

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

Python3和 Python2中__new__使用不同

Python2的寫法

注意 Python 版本大於等於2.7才支援

class Singleton(object):
    def __new__(cls,*args, **kwargs):
        if not hasattr(cls,'_inst'):
            print(cls)
            cls._inst = super(Singleton, cls).__new__(cls,*args,**kwargs)
        return cls._inst


Python3的寫法

class Singleton(object):
    def __new__(cls,*args, **kwargs):
        if not hasattr(cls,'_inst'):
            print(cls)
            cls._inst = super(Singleton, cls).__new__(cls)
        return cls._inst

如果Python3的寫法跟Python2寫法一樣,那麼倒數第二行會報錯"TypeError: object() takes no parameters"


相關文章