Python基礎——類new方法與單例模式
介紹:
new方法是類中魔術方法之一,他的作用是給類例項化開闢一個記憶體地址,並返回一個例項化,再由__init__對這個例項進行初始化,故它的執行肯定就是在初始化方法__init__之前了。new方法的第一個引數cls是類本身的含義(即你要例項化的類),與self不同,self是例項化本身,兩者還是有很大的區別的。
在定義新式類時沒有重新定義new()時 ,Python預設是呼叫該類的直接父類的new()方法來構造該類的例項,如果該類的父類也沒有重寫 new(),那麼將一直按此規矩追溯至object的new()方法,因為object是所有新式類的基類。 如果自己重寫new方法,記住千萬不能返回呼叫自身的new方法,因為這樣會造成死迴圈。
單利化模式
單利化模式的意思是一個類只能被例項化一次,即使例項化多次,利用id()函式可以發現他們的id都是一樣的,即記憶體地址相同,後者例項的會將前面例項化的物件給覆蓋掉,這個模式的好處是可以節省記憶體。程式碼如下:
class Rectangle: def __new__(cls,*args,**kwargs): if not hasattr(cls, '_instance'): cls._instance = super().__new__(cls)#super()方法是呼叫其父類,即object return cls._instance else: return cls._instance def __init__(self,Length,Width): self.Length = Length self.Width = Width print (self.Width) def A(self): print (self.Length) a = Rectangle(4,6) b = Rectangle(5,7) print (a,b)
6
7
<__main__.Rectangle object at 0x00000145F8E22390> <__main__.Rectangle object at 0x00000145F8E22390>
上述程式碼可以發現,在第一次例項化時,我們會用一個私有屬性_instance去接收父類new方法開闢的記憶體,並返回。當我們第二次例項化時,由於私有屬性_instance存在,故直接返回它。可以發現的是,兩次例項化中,new方法所返回的記憶體空間是同一個,故最後得到的例項化當然就是一樣的記憶體地址了,b的初始化帶來的屬性會覆蓋掉a的屬性。