設計模式:針對某一特定問題的套路,或者說是成熟的解決方案,前任工作的總結。
__類名__這位格式的方法為內建方法,__new__為object基類提供的內建的靜態方法。
__new__方法的作用:在記憶體為物件分配空間、返回物件的引用。將引用傳給python直譯器後,會將引用作為物件的第乙個引數,傳給__init__方法,進行物件的初始化。
每次使用類名()建立物件的時候,直譯器會自動呼叫兩個方法:__new__分配空間、__init__物件初始化
__new__方法重寫:**非常固定,一定加上return super(). __new __(cls)。否則,直譯器得不到物件引用。注意new方法是乙個靜態方法,需要主動傳入cls引數。
重寫的語法:
class musicplayer
(object)
: def __new__
(cls,
*args,
**kwargs)
: # 乙個*表示多值的元組引數,兩個*表示多值字典引數
# 1.為證實建立物件時,new方法會自動呼叫
print
("建立物件,分配空間"
) # 2.為物件分配空間
instance =
super()
.__new__
(cls) # 呼叫父類的new方法
# 3.返回物件的引用
return instance
def __init__
(self)
:print()
player =
musicplayer()
print
(player)
輸出:建立物件,分配空間
<__main__.musicplayer object at 0x0000019d74091288
>
思路:
(1)定義乙個類屬性,初始值為none(空物件),記錄建立的第乙個物件的引用。
(2)重寫__new__方法。如果類屬性 is none,呼叫父類分配空間,並記錄在類屬性中;否則返回類屬性中記錄的引用。
class musicplayer
(object)
: instance = none # 定義類屬性,記錄第乙個物件的引用
def __new__
(cls,
*args,
**kwargs)
:if cls.instance is none: # 說明第乙個物件還沒有被建立
cls.instance =
super()
.__new__
(cls) # 呼叫父類方法,為第乙個物件分配空間
return cls.instance
else
: # 若物件不是第乙個
return cls.instance # 返回類屬性中儲存的物件引用
player1 =
musicplayer()
print
(player1)
player2=
musicplayer()
print
(player2)
輸出:<__main__.musicplayer object at 0x000001ccb831db48
>
<__main__.musicplayer object at 0x000001ccb831db48
>
以上方法,可以實現物件的記憶體位址是一樣的。但是會多次呼叫初始化方法。
擴充套件---------需求:只執行一次初始化方法
class musicplayer
(object)
: instance = none
init_flag = false # 記錄是否執行過初始化動作
def __new__
(cls,
*args,
**kwargs)
:if cls.instance is none: # 說明第乙個物件還沒有被建立
cls.instance =
super()
.__new__
(cls) # 呼叫父類方法,為第乙個物件分配空間
return cls.instance
else
: # 若物件不是第乙個
return cls.instance # 返回類屬性中儲存的物件引用
def __init__
(self)
:if musicplayer.init_flag is false: # 通過類名. 的方式呼叫類屬性
musicplayer.init_flag = true
print
() # 執行初始化動作
else
:return
player1 =
musicplayer()
print
(player1)
player2=
musicplayer()
print
(player2)
輸出:<__main__.musicplayer object at 0x0000022ac77e1388
>
<__main__.musicplayer object at 0x0000022ac77e1388
>
以上方法,可以讓初始化的動作只被執行一次,並不是只調一次初始化方法。 Python學習筆記 物件導向
物件導向 oop 基本概念 物件導向程式設計 object oriented programming簡寫 oop 1 物件導向基本概念 之前的學習程式設計方式就是面向過程的 面向過程和物件導向,是兩種不同的程式設計方式 對比面向過程的特點,可以更好的了解什麼是物件導向 2 過程和函式 科普 過程是最...
六 python學習筆記 python物件
1 所有的 python 對像都擁有三個特性 身份,型別和值。身份 每乙個物件都有乙個唯一的身份標識自己,任何物件的身份可以使用內建函式 id 來得到。這個值可以被認為是該物件的記憶體位址。您極少會用到這個值,也不用太關心它究竟是什麼。型別 物件的型別決定了該物件可以儲存什麼型別的值,可以進行什麼樣...
物件導向程式設計 python 學習筆記
物件導向程式設計 object oriented programming,簡稱oop,是一種程式設計思想。oop把物件作為程式的基本單元,乙個物件包含了資料和運算元據的函式。面向過程的程式設計把電腦程式視為一系列的命令集合,即一組函式的順序執行。為了簡化程式設計,面向過程把函式繼續切分為子函式,即把...