單例模式,即乙個類只能有乙個例項(這裡說物件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資料。如果重新實現...