亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python項目中單例怎么利用__new__方法實現

發布時間:2020-12-11 14:28:45 來源:億速云 閱讀:241 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關Python項目中單例怎么利用__new__方法實現,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

介紹

init 方法通常用在初始化一個類實例時候,但其實它不是實例化一個類的時候第一個被調用 的方法。當使用 Student(id, name) 這樣的表達式來實例化一個類時,最先被調用的方法 其實是 new 方法。

new方法接受的參數雖然也是和init一樣,但init是在類實例創建之后調用,而 new方法正是創建這個類實例的方法。

new為對象分配空間,是內置的靜態方法,new在內存中為對象分配了空間也返回了對象的引用,init獲得了這個引用才初始化這個實例。

示例

一個非常簡單的單例

class A:
 instance = None
 def __new__(cls, *args, **kwargs):
  if cls.instance is None:
   cls.instance = super().__new__(cls)
  return cls.instance

因為new方法是一個靜態方法(也就是在定義的時候就沒有cls參數),所以在這里要傳入一個cls參數,而且這里的new你改造過了,所以要返回爸爸的new方法。

按造這個方法改造的單例怎么new都是同一個實例,但init仍然會被執行多次,也就是創建了幾個對象就調用幾次初始化方法。所以還要對init再進行一些判斷。

class A:
 instance = None
 init_flag = False # 初始化標記

 def __new__(cls, *args, **kwargs):
  if cls.instance is None:
   cls.instance = super().__new__(cls)
  return cls.instance

 def __init__(self):
  if A.init_flag:
   return
  print('執行了初始化方法')
  A.init_flag = True

if __name__ == '__main__':
 a = A()
 b = A()
 print(a)
 print(b)

輸出結果:

執行了初始化方法

<main.A object at 0x00000210E6F09320>

<main.A object at 0x00000210E6F09320>

總結

通過重載new方法,可以比較簡單地實現單例,Python還有很多有趣的內置函數,有空可以再研究研究。

補充知識:Python餓漢式和懶漢式單例模式的實現

看代碼吧~

# 餓漢式
class Singleton(object):
 # 重寫創建實例的__new__方法
 def __new__(cls):
  # 如果類沒有實例屬性,進行實例化,否則返回實例
  if not hasattr(cls, 'instance'):
   cls.instance = super(Singleton, cls).__new__(cls)
  return cls.instance

餓漢式在創建的時候就會生成實例

# 懶漢式
class Singleton(object):
 __instance = None
 def __init__(self):
  if not self.__instance:
   print('調用__init__, 實例未創建')
  else:
   print('調用__init__,實例已經創建過了:', __instance)

 @classmethod
 def get_instance(cls):
  # 調用get_instance類方法的時候才會生成Singleton實例
  if not cls.__instance:
   cls.__instance = Singleton()
  return cls.__instance

關于Python項目中單例怎么利用__new__方法實現就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

周至县| 山丹县| 读书| 庄河市| 讷河市| 彭泽县| 蛟河市| 正宁县| 淮滨县| 万荣县| 九寨沟县| 德兴市| 遵义市| 杭锦旗| 满城县| 达孜县| 汉沽区| 体育| 磴口县| 松原市| 泰和县| 安达市| 阿拉善左旗| 法库县| 满洲里市| 友谊县| 榆社县| 彩票| 察雅县| 咸宁市| 东台市| 松桃| 皮山县| 湛江市| 五寨县| 芦山县| 沂源县| 晋宁县| 绍兴市| 昌黎县| 东阿县|