概念:使所有乙個類建立的物件都只有乙個例項(也就是說這些物件的位址相同)
__new __ 方法作用
注意:__new __ 一定要返回物件的引用return super().__new __(cls)
與 __init __ 的區別
建立思想:
就像建立不帶頭結點的單鏈表,初始變數為空,如果是第一次新增(instance is none),則給建立乙個新的物件;否則不執行任何操作。
另外,由於 __init __ 函式每次都要執行,可以增加乙個類屬性flag,控制執行次數。
classa(
object):
instance =
none
init_flag =
false
# new 是靜態方法,即使沒有加上靜態方法的修飾器
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
# do some thing
a.init_flag =
true
aa = a(
)bb = a(
)print(id
(aa)
)print(id
(bb)
)# 二者位址相同
print(id
(a))
# 類物件的位址與上面不同,因為上面建立的是例項物件
乙個簡單的版本:try
:# 嘗試錯誤
pass
except
:# 丟擲異常
pass
更完整的版本:try
:pass
except 錯誤型別1:
pass
except
(錯誤型別2
, 錯誤型別3
, 錯誤型別4):
pass
except exception as result:
print
("未知錯誤:%s"
% result)
else
:# 沒有錯誤才會執行的**
pass
finally
:# 無論是否有異常,都會執行的**
pass
直譯器丟擲的錯誤型別為報錯行的第乙個單詞,ex.:
recursionerror: maximum recursion depth exceeded
則錯誤型別為:recursionerror
技巧:可以利用異常的傳遞性,只在呼叫該函式的地方(例如主函式)做異常處理,這樣就可以不用在每個函式中都做異常處理。
主動丟擲異常(raise)
嘗試 try ——丟擲 raise——捕獲 except
1.建立乙個exception類的物件
2.使用關鍵字raise關鍵字丟擲異常物件
使用:
def
input_password()
: password =
input
("請輸入密碼:")if
len(password)
>=8:
return password
ex = exception(
"密碼長度不夠"
)# 建立exception物件,引號內字串為提示資訊
raise ex # 丟擲異常
try:
print
(input_password())
except exception as result:
print
(result)
學習python 單例設計模式
pyhton建立乙個物件的過程。單例設計模式的一種實現方式。當我們例項化乙個物件的時候,基本上可以分為如下步驟 呼叫 new cls 方法來建立乙個物件,然後找了乙個變數來接受 new 的返回值,這個返回值表示建立出來的物件的引用 呼叫 init 剛建立出來的物件的引用 方法,初始化成員變數。返回物...
(六)設計模式 單例模式
保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。注意 head first 中提到單例模式的時候,類建構函式為私有 private 通過靜態方法建立例項。剛解放時,國家需要人,人多力量大,於是乙個老百姓可能生了很多娃,於是人口迅速暴增。後來實行了計畫生育,規定了一對夫婦最多只能生育一胎,並把...
python物件導向學習筆記六 單例
設計模式 針對某一特定問題的套路,或者說是成熟的解決方案,前任工作的總結。類名 這位格式的方法為內建方法,new 為object基類提供的內建的靜態方法。new 方法的作用 在記憶體為物件分配空間 返回物件的引用。將引用傳給python直譯器後,會將引用作為物件的第乙個引數,傳給 init 方法,進...