簡介:
本文主要講兩個問題:
-
pyhton創建一個對象的過程。
-
單例設計模式的一種實現方式。
python 創建一個對象的過程
當我們實例化一個對象的時候,基本上可以分爲如下步驟:
-
調用
__new__(cls)
方法來創建一個對象,然後找了一個變量來接受__new__
的返回值,這個返回值表示創建出來的對象的引用 -
調用
__init__(剛創建出來的對象的引用)
方法,初始化成員變量。 -
返回對象的引用
注意,這裏__new__
方法裏面需要傳遞的參數是cls
,指的是
我們可以拿
python
創建一個對象的過程和c++
的構造函數做個對比。顯然c++
的構造函數即負責創建對象,又負責初始化成員變量; 而python
是通過兩個步驟來完成的:__new__(cls)
方法只負責創建對象,__init__
方法只負責初始化成員變量。
從上面的總結來看,一個常見的誤區就是錯誤的把
__init__
方法等價於構造函數,嚴格來說他們是不等價的。
單例模式的一種實現方式
有了上述__new__
方法的機制,我們可以設計一個單例模式如下:
這裏增加了一個附加的東西,即設計一個單例的同時只初始化一次成員變量。
class Singleton(object):
__instance = None
__init_flag = False
def __new__(cls, *args, **kwargs):
if cls.__instance == None:
cls.__instance = object.__new__(cls)
return cls.__instance
def __init__(self, num): # 這裏通過設置一個類屬性的方式實現了只初始化一次成員變量的目的
if not Singleton.__init_flag:
self.num = num
Singleton.__init_flag = True
s = Singleton(100)
print(s.num)
s1 = Singleton(200) # 第二次初始化參數時不會打印200
print(s1.num)
# Output
100
100