只有繼承于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)

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/531455.html
標籤:其他
上一篇:淺談PHP設計模式的模板方法模式
