首先,只有新式類才有魔法方法__new__(),從object類繼承的子類,都是新式類。
object類關於__new__()的定義如下:
@staticmethod # known case of __new__
def __new__(cls, *more): # known special case of object.__new__
""" t.__new__(s, ...) -> a new object with type s, a subtype of t """
pass
引數說明:
(1)object將__new__()定義成靜態方法。
(2)傳入的引數至少乙個cls引數,cls表示需要例項化的類。
如何使用,舉個例子:
class a(object):
def __init__(self, value):
print "into __init__"
self.value = value
def __new__(cls, *args, **kwargs):
print "into __new__"
return super(a, cls).__new__(cls, *args, **kwargs)
a = a(10)
# 結果如下:
# into __new__
# into __init__
可發現,在呼叫__init__()初始化前,先呼叫了__new__()。
在新式類中,__new__()對當前類進行了例項化,並將例項返回,傳給了__init__(),__init__()方法中是self就是__new__()傳過來的。
但是,執行了__new__(),並不一定會進入__init__(),只有__new__()返回了,當前類cls的例項,當前類的__init__()才會進入。
看兩個例子:
class a(object):
def __init__(self, value):
print "into a __init__"
self.value = value
def __new__(cls, *args, **kwargs):
print "into a __new__"
return object.__new__(cls, *args, **kwargs)
class b(a):
def __init__(self, value):
print "into b __init__"
self.value = value
def __new__(cls, *args, **kwargs):
print "into b __new__"
return super(b, cls).__new__(cls, *args, **kwargs)
b = b(10)
b = b(10)
# 結果:
# into b __new__
# into a __new__
# into b __init__
class a(object):
def __init__(self, value):
print "into a __init__"
self.value = value
def __new__(cls, *args, **kwargs):
print "into a __new__"
return object.__new__(cls, *args, **kwargs)
class b(a):
def __init__(self, value):
print "into b __init__"
self.value = value
def __new__(cls, *args, **kwargs):
print "into b __new__"
return super(b, cls).__new__(a, *args, **kwargs) #改動了cls變為a
b = b(10)
# 結果:
into b __new__
into a __new__
若__new__沒有正確返回當前類cls的例項,那__init__是不會被呼叫的,即使是父類的例項也不行,將沒有__init__被呼叫。
__new__的作用
(1)__new__方法主要是當你繼承一些不可變的class時(比如int, str, tuple), 提供給你乙個自定義這些類的例項化過程的途徑。
假如我們需要乙個永遠都是正數的整數型別。
class positiveinteger(int):
def __init__(self, value):
super(positiveinteger, self).__init__(self, abs(value))
i = positiveinteger(-3)
print i
# -3
class positiveinteger(int):
def __new__(cls, value):
return super(positiveinteger, cls).__new__(cls, abs(value))
i = positiveinteger(-3)
print i
# 3通過過載__new__方法,我們實現了需要的功能。
(2)實現單例
一些說明:
(1)在定義子類時沒有重新定義__new__()時,python預設是呼叫該類的直接父類的__new__()方法來構造該類的例項,如果該類的父類也沒有重寫__new__(),那麼將一直按此規矩追溯至object的__new__()方法,因為object是所有新式類的基類。
Python 魔法方法(一) new
首先,只有新式類才有魔法方法 new 從object類繼承的子類,都是新式類。object類關於 new 的定義如下 staticmethod known case of new def new cls,more known special case of object.new t.new s,a ...
Python魔法方法 基本的魔法方法
new cls 1.new 是在乙個物件例項化時候所呼叫的第乙個方法 2.他的第乙個引數是這個類,其他的引數是用來直接傳遞給 init 方法 3.new 決定是否使用該 init 方法,因為.new 可以直接呼叫其他類的構造方法,或者返回別的例項物件來作為本類的例項,如果 new 沒有返回例項物件,...
python 魔法方法
魔法方法具有一定的特徵 new cls class capstr str def new cls,string 修改新類裡的new方法,需傳入乙個引數 string string.upper return str.new cls,string 用父類裡的new方法進行返回,直接飯後構造後的物件def...