LeetCode 48. 旋轉影象
阿新 • • 發佈:2020-12-20
""" 1 繼承自 object的新式類 才會有__new__ 2 __new__ 必須要有一個引數cls 代表當前類 此引數在例項化時由 python直譯器自動識別 3 __new__ 必須要有返回值 返回例項化出來的例項 這點在自己實現new方法的時候需要特別的注意 可以return 父類(通過supper(當前類名,cls).__new__出來的例項)) 或者直接就是object的__new__出來的例項 4 __init__ 的self引數 其實就是self就是new返回的例項,init在new 的基礎上可以完成一些其他的初始化動作 init不需要返回值 5 如果new建立的是當前類的例項 會自動呼叫init方法完成初始化,通過return語句裡面呼叫的new函式的第一個cls來保證是當前類的例項 如果是其他類的類名 那麼實際上建立返回的就是其他類的例項 其實就不會呼叫當前類的init函式 但是會呼叫返回例項的init方法 6 如果 新式類中重寫了new方法 那麼可以自由選擇任意一個的其他的新式類(只有新式類才會有new 並且所有的新式類都是object的子類 而經典類沒有new方法)new方法來製造例項 包括這個新式類的所有前代類和後袋類,只要他們不會造成遞迴死迴圈 7 在任何新式類中new方法中 不能呼叫自身的__new__() 來製造例項 會造成死迴圈 必須要避免一下類似的洗髮 return A.__new__(cls,*args,*kwargs)或者 cls.__new__(cls,*args,*kwargs) 使用object或者沒有血緣關係的新式類的__new__() 是安全的 但是如果是在有繼承關係的2個類之間,應該避免死迴圈 例如 在A中 return B.__new__(cls,*args,**kwargs) 在B中 return A.__new__(cls,*args,**kwargs) """ class A(object): def __new__(cls, *args, **kwargs): print("in A __new__---->%s"%(cls)) return object.__new__(cls, *args, **kwargs) def __init__(self,*args, **kwargs): print("in A __init__") self.a=123 class B(A): def __new__(cls, *args, **kwargs): return super().__new__(cls, *args, **kwargs) def __init__(self, *args, **kwargs): print("in B init") if __name__ == '__main__': a=B()