以單例來講如何用python來new乙個物件

2021-10-01 20:16:11 字數 2132 閱讀 7248

python和c語言不同,在建構函式時不能夠分配記憶體空間,但是在建構函式時,也可以通過__new__函式來實現一些跟記憶體相關的操作,比如單例模式。

估計有很多小盆友不知道什麼是單例,python的單例就是在例項化時,不管例項化多少次都用的同一塊記憶體空間。

另外需要說明的是,建構函式需要用__new__來實現,而__init__為初始化函式,__init__在例項化時呼叫,__new__在建構函式時呼叫。

先舉個例子:

class test:

def __new__(cls, *args, **kwargs):

print("this is new!")

return object.__new__(cls, *args, **kwargs)

def __init__(self):

print("this is init!")

test = test()

執行後列印結果為:

this is new!

this is init!

可以看到,__new__是在__init__之前執行,並且__new__需要返回object.__new__(),將cls本身作為引數傳遞。

所以__new__可以在建構函式時,對函式動點手腳,比如單例:

class single(object):

# 在建構函式時,先檢查instance

def __new__(cls, *args, **kwargs):

if not hasattr(cls, 'instance'):

cls.instance = super(single, cls).__new__(cls)

return cls.instance

def test():

pass

tmp1 = single()

print(tmp1)

tmp2 = single()

print(tmp2)

print(single().test)

列印結果為:

<__main__.single object at 0x0000000002a5cf60>

<__main__.single object at 0x0000000002a5cf60>

>

可以看到,不管怎麼例項化,被分配的都是同一塊記憶體,而當我把__new__函式去掉時:

class single(object):

def test():

pass

tmp1 = single()

print(tmp1)

tmp2 = single()

print(tmp2)

print(single().test)

列印結果為:

<__main__.single object at 0x00000000028a9908>

<__main__.single object at 0x0000000002a5cc50>

>

可以看到,不是單例情況下,每次例項化都會開闢一塊新的記憶體出來。

另外需要注意的是,單例模式每次例項化都會覆蓋掉之前定義的引數,比如:

class single:

def __new__(cls, *args, **kwargs):

if not hasattr(cls, 'instance'):

cls.instance = super(single, cls).__new__(cls)

return cls.instance

def __init__(self, input):

self.input = input

def test(self):

print(self.input)

tmp1 = single("this is no.1")

tmp2 = single("this is no.2")

tmp1.test()

列印結果為:

this is no.2
可以看到tmp1已經完全被覆蓋了。

如何用Java實現單例模式

public class configuration public static configuration getinstnace return instance other methods 由於將同步放在了判斷之後,這樣就減少了可能產生同步的機會。實際上,在大多數情況下 單例已經完成了初始化之後...

python 如何用修飾符打造乙個單例

python的官方wiki給出了乙個用修飾符實現的單例,如下 def singleton cls instance cls instance.call lambda instance return instance singleton class highlander x 100class high...

Python如何實現單例模式

單例模式 singleton pattern 是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當你希望在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。單例設計模式介紹 參考 實現方法 將需要實現的單例功能放到乙個.py 檔案中 實現原理 python 的模組就...