python物件導向程式設計實現類的單例模式

2021-10-07 22:39:24 字數 1844 閱讀 4217

單例模式,即乙個類只能有乙個例項(這裡說物件a),也就是說,不管例項化多少個物件,都共同擁有那乙個例項(物件a)的記憶體,即所有的物件都可以看成是對物件a的引用。

__new__方法必須有乙個返回值,且必須返回當前類的乙個例項物件,如果沒有return語句,則不會執行init方法,所以也就不會對例項初始化

__new__方法必須返回和當前類一致的乙個例項,父類也不行,否則不會執行__init__方法。

定義乙個類屬性的物件。給其初始化為0,在new方法去生成例項物件的時候進行判斷,如果a==0,就說明這是第一次例項化物件,那麼就生成乙個例項化物件,並把這個例項化物件賦值給a,如果a不等於0,就說明已經建立過例項化物件了,此時就不需要再重新建立乙個例項化物件,直接返回第一次建立的例項化物件即可。

關於類屬性和例項屬性,我是這樣理解的:

例項屬性,是每個物件單獨擁有的。類屬性是大家共同擁有的。

可以模擬租房子。假設有3個人合租房子,房子是3個臥室還有乙個客廳。那麼臥室就是例項屬性,只能自己訪問。客廳就是類屬性,大家共同享有,且每個人都可以對其進行修改。

class

bus317

(object)

:#類屬性

(記憶體是公用的)

line=

"317"

a=0 # __init__方法裡面的屬性是例項屬性

(每個物件都有乙個例項屬性,會給每個例項物件開闢不同的記憶體)

def __init__

(self,car_num,name)

: self.car_name=car_num

self.name = name

self.line=

"318"

self.lst=

print

("建立物件"

)

def __new__

(cls,

*args,

**kwargs)

:if bus317.a==0:

bus317.a = object.

__new__

(cls) #object.new建立乙個例項

return bus317.a

print

("***xx"

) #只會執行一次

def run

(self,flag)

:print

("bus317 run"

)if flag==0:

print

("從a站開往c站"

)else

:print

("從c站開往a站"

可以看到,最開始輸出的***xx,是在定義類的時候,輸出的,只會執行一次,因為這是屬於類屬性的,所以在建立物件的時候不會執行。只是在類建立的時候會執行一次。那麼很顯然,類屬性a是屬於類的,所以不論建立多少個例項化物件,在記憶體裡面為物件開闢空間的時候,都不會為類屬性a分配空間,只會建立類似於指標的東西,讓其指向a的記憶體(類建立時分配的空間),會為每個例項化物件分配例項屬性的記憶體,因為這是每個物件所獨自擁有的。

python的類 物件導向程式設計

摘自謬雪峰 物件導向程式設計的乙個重要特點就是資料封裝,在上面的student類中,每個例項就擁有各自的name和score這些資料。我們可以通過函式來訪問這些資料,比如列印乙個學生的成績 def print score std print s s std.name,std.score print ...

Python 物件導向程式設計 內建類方法

說明 init self,初始化物件,在建立新物件時呼叫 del self 釋放物件,在物件被刪除之前呼叫 new cls,args,kwd 例項的生成操作 str self 在使用print語句時被呼叫 getitem self,key 獲取序列的索引key對應的值,等價於seq key len ...

Python3 物件導向程式設計 類

一 自定義類 1 屬性與方法 格式 class classname def init self,a,b self.a a self.b b def 一般都有乙個 init 函式來定義屬於這個類的引數,前後都被 包圍的函式為特殊方法 以 開頭的變數只能讀,不能寫,相當於private資料。如果重新實現...