只有繼承於object的新式類才能有__new__方法,__new__方法在創建類實例對象時由Python解釋器自動調用,一般不用自己定義,Python預設調用該類的直接父類的__new__方法來構造該類的實例,如果該類的父類也沒有重寫__new__,那麼將一直按此規矩追溯至object的__new ...
只有繼承於object的新式類才能有__new__
方法,__new__
方法在創建類實例對象時由Python解釋器自動調用,一般不用自己定義,Python預設調用該類的直接父類的__new__
方法來構造該類的實例,如果該類的父類也沒有重寫__new__
,那麼將一直按此規矩追溯至object的__new__
方法,因為object是所有新式類的基類,若需要自定義__new__
方法,一般用法如下:
class Person(object):
def __new__(cls):
return object.__new__(cls)
__new__
至少要有一個參數cls,代表要實例化的類,此參數在實例化時由Python解釋器自動提供;__new__
必須要有返回值,返回實例化出來的實例,可以return父類new出來的實例,或直接是object的new出來的實例。
object.new(cls)執行完返回的結果為Person類的實例對象,如下:
class Person(object):
def __init__(self):
print("__init__")
self.name="張三"
def __new__(cls):
print('__new__')
ob = object.__new__(cls)#ob為Person實例對象
print(ob)
return ob
p1 = Person()
print(p1.name)
p1=Person()該語句主要做了以下工作:
首先調用Person的__new__
方法,該方法通過object.new(cls)創建了Person實例對象,並返回。最後調用了該Person實例對象的__new__
方法。
object.new()方法接收的參數是類對象,可以不是當前類對象cls,如果將cls換成其他類對象會發生什麼呢,看下麵代碼的運行結果:
class Dog(object):
def __init__(self):
self.name="旺財"
print("Dog.__init__")
class Person(object):
def __init__(self):
self.name="張三"
print("Person.__init__")
def __new__(cls):
print('__new__')
ob = object.__new__(Dog)
return ob
p1 = Person()
print(type(p1))
由結果得知p1是Dog類的實例,但是有個問題,Python解釋器沒有自動執行__new__
方法,由結果可以看出並沒有列印字元串__new__
。若__new__()
沒有正確返回當前類cls的實例,那__init__()
將不會被調用。 我們可以在__new__
方法中手動調用__new__
方法(實際開發中好像沒什麼用)
class Dog(object):
def __init__(self):
self.name="旺財"
print("__init__")
class Person(object):
def __init__(self):
self.name="張三"
print("__init__")
def __new__(cls):
print('__new__')
ob = object.__new__(Dog)
ob.__init__()
return ob
p1 = Person()
print(type(p1))
print(p1.name)