Python 之 __new__() 方法與實例化

https://www.cnblogs.com/ifantastic/p/3175735.html

在繼承基類實例化時,首先調用的__new__方法根據其第一個參數(即將生成的類)確定用哪個基類的__init__方法去初始化。

__new__方法是實例化的準備工作,在__init__之前運行。__init__是真正的實例化

class Foo(object):
    def __init__(self, *args, **kwargs):
        ...
    def __new__(cls, *args, **kwargs):
        return object.__new__(cls, *args, **kwargs)    

# 以上return等同於 
# return object.__new__(Foo, *args, **kwargs)
# return Stranger.__new__(cls, *args, **kwargs)
# return Child.__new__(cls, *args, **kwargs)

class Child(Foo):
    def __new__(cls, *args, **kwargs):
        return object.__new__(cls, *args, **kwargs)
# 如果Child中沒有定義__new__()方法,那麼會自動調用其父類的__new__()方法來製造實例,即 Foo.__new__(cls, *args, **kwargs)。
# 在任何新式類的__new__()方法,不能調用自身的__new__()來製造實例,因爲這會造成死循環。因此必須避免類似以下的寫法:
# 在Foo中避免:return Foo.__new__(cls, *args, **kwargs)或return cls.__new__(cls, *args, **kwargs)。Child同理。
# 使用object或者沒有血緣關係的新式類的__new__()是安全的,但是如果是在有繼承關係的兩個類之間,應避免互調造成死循環,例如:(Foo)return Child.__new__(cls), (Child)return Foo.__new__(cls)。
class Stranger(object):
    ...
# 在製造Stranger實例時,會自動調用 object.__new__(cls)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章