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