python物件導向學習筆記六 單例

2021-10-10 08:09:25 字數 2980 閱讀 1514

設計模式:針對某一特定問題的套路,或者說是成熟的解決方案,前任工作的總結。

__類名__這位格式的方法為內建方法,__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把物件作為程式的基本單元,乙個物件包含了資料和運算元據的函式。面向過程的程式設計把電腦程式視為一系列的命令集合,即一組函式的順序執行。為了簡化程式設計,面向過程把函式繼續切分為子函式,即把...