class
person
:def
__init__
(self, name)
: self.name = name
p1 = person(
'zyp'
)p2 = person(
"zyp"
)print
(p1.name, p2.name)
print
(p1)
print
(p2)
print
(p1 is p2)
zyp zyp
<__main__.person object at 0x000001a250fc6390>
<__main__.person object at 0x000001a250fc6320>
false
class
player
(object):
def__new__
(cls,
*args,
**kwargs)
:print
("__new__方法被呼叫,為物件分配記憶體空間"
)return
super()
.__new__(cls)
def__init__
(self)
:print
("__init__例項化物件"
)
player = player(
)# __new__方法不返回內容,
class
error
(object):
def__new__
(cls,
*args,
**kwargs)
:print
("__new__方法被呼叫"
)def
__init__
(self)
:print
("__init__方法被呼叫"
)e = error(
)
__new__方法被呼叫,為物件分配記憶體空間
__init__例項化物件
__new__方法被呼叫
# 1. 判斷類屬性是否為none
# 2. 呼叫父類方法,為第乙個物件分配記憶體空間
# 3. 返回類屬性儲存的物件引用
class
player
(object):
instance =
none
def__new__
(cls,
*args,
**kwargs)
:if cls.instance is
none
: cls.instance =
super()
.__new__(cls)
return cls.instance
player1 = player(
)player2 = player(
)print
(player1)
print
(player2)
<__main__.player object at 0x000001a250fc6240>
<__main__.player object at 0x000001a250fc6240>
對__new__
方法改造之後,每次都會得到 第一次被建立物件的引用;但是:初始化方法還會被再次呼叫
# 初始化方法被呼叫了兩次
# 第二次呼叫的初始化方法會修改第一次初始化的值,因為他們的記憶體位址是一樣的
class
player
(object):
instance =
none
def__new__
(cls,
*args,
**kwargs)
:if cls.instance is
none
: cls.instance =
super()
.__new__(cls)
return cls.instance
def__init__
(self, name)
: self.name = name
p1 = player(
'111'
)print
(p1.name)
p2 = player(
'222'
)print
(p1.name)
print
(p2.name)
111
222222
定義乙個類屬性 init_flag 標記是否 執行過初始化動作,初始值為 false
在__init__
方法中,判斷 init_flag,如果為 false 就執行初始化動作
然後將 init_flag 設定為 true
這樣,再次 自動 呼叫__init__
方法時,初始化動作就不會被再次執行 了
class
player
(object):
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, name)
:# 如果已經初始化過,則直接返回
# 沒有初始化則將進行初始化,並將初始化標記置為true
if self.__class__.init_flag ==
true
:return
else
: self.name = name
self.__class__.init_flag =
true
# 初始化方法只呼叫一次
# 只記錄第一次初始化的值
p1 = player(
'111'
)print
(p1.name)
p2 = player(
'222'
)print
(p1.name)
print
(p2.name)
111
111111
**站 物件
印表機 物件
Python設計模式之單例模式
站 物件 印表機 物件 使用類名 建立物件時,python 的直譯器首先 會 呼叫 new 方法為物件 分配空間。new 是乙個 由object基類提供的內建的靜態方法,主要作用有兩個 python 的直譯器獲得物件的 引用 後,將引用作為 第乙個引數,傳遞給 init 方法。重寫 new 方法 的...
python設計模式之單例模式
單例模式是一種建立型設計模式,它確保乙個類有且只有乙個特定型別的物件,並提供全域性訪問點。其意圖為 簡單理解 單例即為單個例項,也就是每次例項化建立物件時獲得的都是同乙個物件,當然同乙個物件的屬性都是相同的,方法也是相同的,位址也是相同的,這樣給我們帶來的好處就是可以避免消耗過多的記憶體或cpu資源...
Python設計模式之單例模式
單例模式屬於建立型模式,它提供了一種建立物件的最佳方式。這種模式涉及到乙個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。單例模式是獲取全域性狀態的一種相當好的方法,但這也是對於單例模式的主要批評之處,因為在...