日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python3单例-python3如何运行文件夹python单例模式

發布時間:2024/7/23 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python3单例-python3如何运行文件夹python单例模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單例模式是一種常用的軟件設計模式.

在單例模式的核心結構中,只包含一個被稱為單例類的特殊類.

通過單例模式可以保證系統中一個類只有一個實例,而且這個實例可以輕易被外界訪問,方便控制實例對象的個數以節約系統資源.

單例模式是解決一個系統中某個類的實例化對象有且只能有一個的最好解決方案.

單例模式的要點有三個:

某個類只能有一個實例

這個類必須自行創建其唯一實例

這個類必須自行向整個系統提供這個唯一實例.

在python中,單例模式有三種實現方式:

方法一,使用__new__方法

先定義一個類,類中定義__new__方法,然后將類的一個實例類綁定到類變量中.

如果類的_instance值為None,則說明這個類還沒有被實例化過,程序會自動實例化一個類的實例,然后返回.

如果類的_instance值不為None,則程序會直接返回_instance.

代碼如下:

class Singleton(object):

_instance = None

def __init__(self):

pass

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

if not cls._instance:

cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)

return cls._instance

class MyClass(Singleton):

a = 1

電腦技術網認為此文章對《python3如何運行文件夾python單例模式》說的很在理。

在上面的代碼中,我們將類的實例和一個類變量 _instance關聯起來.

如果 cls._instance為 None 則創建實例,否則直接返回cls._instance。

用上來定義的類實例化兩個對象:

cls1=MyClass()

cls2=MyClass()

print(id(cls1))

print(id(cls2))

print(cls1 == cls2)

print(cls1 is cls2)

得到的結果

43606480

43606480

True

True

方法二,使用decorator裝飾器

我們知道,裝飾器(decorator)可以動態地修改一個類或函數的功能。

在這里使用裝飾器來裝飾某個類,使其只能生成一個實例,代碼如下:

def singleton(cls):

instances={}

def getinstance(*args,**kwargs):

if cls not in instances:

instances[cls]=cls(*args,**kwargs)

return instances[cls]

return getinstance

@singleton

class MyClass(object):

a=1

在上面,我們定義了一個裝飾器singleton,它返回了一個內部函數getinstance,該函數會判斷某個類是否在字典instances中,

如果不存在,則會將cls作為key,cls(*args, **kw)作為value存到instances中,否則,直接返回instances[cls]。

使用上面定義的類實例化兩個對象,比較兩個對象

cls1=MyClass()

cls2=MyClass()

print(id(cls1))

print(id(cls2))

print(cls1 == cls2)

print(cls1 is cls2)

得到的結果為:

43672016

43672016

True

True

方法三,使用元類(metaclass)

元類(metaclass)可以控制類的創建過程,它主要做三件事:

攔截類的創建

修改類的定義

返回修改后的類

用元類實現單例模式的代碼如下:

class Singleton(type):

_inst = {}

def __call__(self, *args, **kw):

if self not in self._inst:

self._inst[self] = super(Singleton, self).__call__(*args, **kw)

return self._inst[self]

class MyClass1(metaclass=Singleton):

def __init__(self):

self.xx = 0

def getval(self):

return self.xx

def setval(self, val):

self.xx = val

cls1=MyClass()

cls2=MyClass()

print(id(cls1))

print(id(cls2))

print(cls1 == cls2)

print(cls1 is cls2)

得到的結果為:

43477984

43477984

True

True

方法四,使用classmethod方法創建單例模式

class Foo:

_instance = None

def __init__(self):

pass

@classmethod

def get_instance(cls):

if cls._instance:

return cls._instance

else:

obj=cls()

cls._instance=obj

return obj

cls1=Foo.get_instance() # 實例化對象a1時,沒有執行Foo這個類的__init__方法,直接執行Foo類的get_instance方法,在這里cls代指的是Foo類

# 前面把_instance賦值為None,所以直接執行else中的語句,實例化一個obj對象,然后把obj對象中的_instance方法賦值為obj對象本身,然后返回obj對象

cls2=Foo.get_instance() # 實例化a1時,Foo類中的_instance已經被賦值為obj對象,所以再次執行Foo中的get_instance方法時,是執行if中的語句

# 此時cls._instance就指的是obj對象,所以這里也返回obj這個對象

print(id(cls1))

print(id(cls2))

print(cls1 == cls2)

print(cls1 is cls2)

這種方法由于在實例化對象時要調用類中的get_instance方法,所以用的不多,知道即可.

特別聲明

Python的模塊是天然的單例模式

在一個py文件中,多次導入同一個模塊,這個模塊也只有在第一次的時候被導入,后續的該模塊導入語句都不會再執行了

更多:python3如何運行文件夾python單例模式

https://www.002pc.comhttps://www.002pc.com/python/2311.html

你可能感興趣的python,單例,模式

No alive nodes found in your cluster

0踩

0 贊

總結

以上是生活随笔為你收集整理的python3单例-python3如何运行文件夹python单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。