python中的__new__方法詳解


python中的__new__方法 

1、創建類時先執行類的__init__方法

2、當一個類實例化時(創建一個對象)執行類的__call__方法,__call__方法的返回值就是實例化的對象

①__call__內部調用:

  • 類.__new__方法,創建一個對象
  • 類.__init__方法,初始化對象

②__new__() 方法的特性:

  • __new__() 方法是在類准備將自身實例化時調用。
  • __new__() 方法始終都是類的靜態方法,即使沒有被加上靜態方法裝飾器

3、實例化對象是誰取決於__new__方法,__new__返回什么就是什么【可以在一個類中重寫父類object的__new__方法】

① 所有的類都繼承自object(即所有類的父類都是object或者說object是所有新式類的基類)

② 如果(新式)類中沒有重寫__new__()方法,即在定義新式類時沒有重新定義__new__()時,Python默認是調用該類的直接父類的__new__()方法來構造該類的實例,如果該類的父類也沒有重寫__new__(),那么將一直按此規矩追溯至object的__new__()方法,因為object是所有新式類的基類。

③如果要得到當前類的實例,應當在當前類中的 __new__() 方法語句中調用當前類的父類的 __new__() 方法。

例如,如果當前類是直接繼承自 object,那當前類的 __new__() 方法返回的對象應該為:

def __new__(cls, *args, **kwargs):
  ...
  return object.__new__(cls) #傳入參數是類對象,所以創建類的實例對象時(在不重寫基類__new__方法的前提下),返回的就是是類的實例對象。
  • __new__至少要有一個參數cls,代表要實例化的類,此參數在實例化時由Python解釋器自動提供
  • __new__必須要有返回值,返回實例化出來的實例,這點在自己實現__new__時要特別注意,可以return父類__new__出來的實例,或者直接是object的__new__出來的實例
  • __init__有一個參數self,就是這個__new__返回的實例,__init__在__new__的基礎上可以完成一些其它初始化的動作,__init__不需要返回值

4、例子:

class Foo(object):
  pass
obj=Foo() #默認是調用該類的直接父類的__new__()方法來構造該類的實例
print(obj) #打印結果:<__main__.Foo object at 0x000002636FEAA208>

class F1(object):
  #重寫__new__方法,返回這個重寫的__new__方法
  def __new__(cls, *args, **kwargs):
    return 123
obj=F1() #實例化對象是誰取決於__new__方法,__new__返回什么就是什么
print(obj,type(obj)) #打印結果:123 <class 'int'>
class F2(object):
  pass
class F3(object):
  def __new__(cls, *args, **kwargs):
    return F2()
obj=F3() #實例化對象是誰取決於__new__方法,__new__返回什么就是什么
print(obj) #<__main__.F2 object at 0x00000210119BA4A8>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM