與__init__一樣,每當實例化類時MyClass(*args, **kwargs) ,__new__ 都會默認自動執行MyClass.__new__(*args, **kwargs),如果想改變默認__new__行為,可以對它自定義
看一個英寸轉換為米例子:
1 class inch(float): 2 def __new__(cls, arg=0.0): 3 return float.__new__(cls, arg * 0.0254)
改變了__new__的自定義實例化類
inch繼承自float
如果同時存在__new__ ,__init__則__new__比__init__先運行,__new__將返回一個對象
a = inch(12)
print isinstance(a, float) 這里將會是True,可以認為inch實例化的對象類型是float,是可以直接拿來做加減乘除等操作
print a + 0.1 #進行基本的浮點運算。
再來個單例的,通過重載__new__實現單例:
class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) return cls._instance