導航:首頁 > 編程語言 > python單例模式不初始化

python單例模式不初始化

發布時間:2022-05-27 10:39:30

python中init方法無法初始化,請大神賜教

首先你要明白類的三大特性,封裝,繼承,多態。你這個主要是封裝得應用。實際圖二也是錯誤的,無法獲得url的值。圖一的稍微改下就對了。
def __init__( self,url):
self. url= url
這樣在對類引用的時候給url賦值就行了

② Python如何實現單例模式

有些時候你的項目中難免需要一些全局唯一的對象,這些對象大多是一些工具性的東西,在Python中實現單例模式並不是什麼難事。以下總結幾種方法:
使用類裝飾器
使用裝飾器實現單例類的時候,類本身並不知道自己是單例的,所以寫代碼的人可以不care這個,只要正常寫自己的類的實現就可以,類的單例有裝飾器保證。
def singleton(cls):
instances = {}
def _wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return _wrapper
你會發現singleton裝飾器內部使用了一個dict。當然你也可以用其他的方式,不過以下的實現是錯誤的:
def singleton(cls):
_instance = None #外部作用域的引用對於嵌套的內部作用域是只讀的
def _wrapper(*args, **kwargs):
if _instance is None: #解釋器會拋出"UnboundLocalError: ...referenced before assignment"
_instance = cls(*args, **kwargs) #賦值行為使解釋器將"_instance"看作局部變數
return _instance
return _wrapper
使用元類(__metaclass__)和可調用對象(__call__)
Python的對象系統中一些皆對象,類也不例外,可以稱之為」類型對象」,比較繞,但仔細思考也不難:類本身也是一種對象,只不過這種對象很特殊,它表示某一種類型。是對象,那必然是實例化來的,那麼誰實例化後是這種類型對象呢?也就是元類。
Python中,class關鍵字表示定義一個類對象,此時解釋器會按一定規則尋找__metaclass__,如果找到了,就調用對應的元類實現來實例化該類對象;沒找到,就會調用type元類來實例化該類對象。
__call__是Python的魔術方法,Python的面向對象是」Duck type」的,意味著對象的行為可以通過實現協議來實現,可以看作是一種特殊的介面形式。某個類實現了__call__方法意味著該類的對象是可調用的,可以想像函數調用的樣子。再考慮一下foo=Foo()這種實例化的形式,是不是很像啊。結合元類的概念,可以看出,Foo類是單例的,則在調用Foo()的時候每次都返回了同樣的對象。而Foo作為一個類對象是單例的,意味著它的類(即生成它的元類)是實現了__call__方法的。所以可以如下實現:
class Singleton(type):
def __init__(cls, name, bases, attrs):
super(Singleton, cls).__init__(name, bases, attrs)
cls._instance = None
def __call__(cls, *args, **kwargs):
if cls._instance is None
# 以下不要使用'cls._instance = cls(*args, **kwargs)', 防止死循環,
# cls的調用行為已經被當前'__call__'協議攔截了
# 使用super(Singleton, cls).__call__來生成cls的實例
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instance

class Foo(object): #單例類
__metaclass__ = Singleton

>>>a = Foo()
>>>b = Foo()
>>>a is b
>>>True
>>>a.x = 1
>>>b.x
>>>1
使用__new__
__init__不是Python對象的構造方法,__init__只負責初始化實例對象,在調用__init__方法之前,會首先調用__new__方法生成對象,可以認為__new__方法充當了構造方法的角色。所以可以在__new__中加以控制,使得某個類只生成唯一對象。具體實現時可以實現一個父類,重載__new__方法,單例類只需要繼承這個父類就好。
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance

class Foo(Singleton): #單例類
a = 1

③ python 為啥沒執行初始化方法

在對象創建得時候會調用初始化方法,你圖上得代碼是正確得,寫的代碼出錯了,下面看一個簡單得示例

代碼:

classCar:
def__init__(self):
print("執行了初始化方法")
defrun(self):
print("車子運行起來了")


car=Car()
car.run()

運行結果:

④ 為什麼我在prthon寫print(「hello world"),會出現無法初始化設備 PRN

要先進入python,即先在命令行下輸入python回車,進入python編輯模式。

這種報錯還有一種情況是,當在DOS命令提示符下,運行「*.Py」文件的時候,如果之前使用編輯器編輯python的代碼,有的編輯器會在文件開始的地方加上了幾個特殊字元(UTF-8 BOM),結果導致程序運行出現錯誤。

另外還需要注意:python文件名只能是英文字母、數字和下劃線的組合。

(4)python單例模式不初始化擴展閱讀

Python可應用於多平台包括 Linux 和 Mac OS X。可以通過終端窗口輸入 "python" 命令來查看本地是否已經安裝Python以及Python的安裝版本。

Python環境變數配置

程序和可執行文件可以在許多目錄,而這些路徑很可能不在操作系統提供可執行文件的搜索路徑中。

path(路徑)存儲在環境變數中,這是由操作系統維護的一個命名的字元串。這些變數包含可用的命令行解釋器和其他程序的信息。

Unix或Windows中路徑變數為PATH(UNIX區分大小寫,Windows不區分大小寫)。

在Mac OS中,安裝程序過程中改變了python的安裝路徑。如果用戶需要在其他目錄引用Python,則必須在path中添加Python目錄。

⑤ 怎麼理解python單例模式

在聊這之前我們首先要明確的是,單例模式在實際中的意義以及在python中具有實現的價值?

當前,相信有很多人支持單例模式,也有不少人反對,尤其是在python中,目前依舊具有很大的爭議性。我們要在評論之前首先要了解單例模式

什麼是單例模式?

顧名思義:就是單個模式

單例模式是一種常見的軟體設置模式,在它的核心結構中只包含一個被稱為單例類的特殊類,通過單例模式可以保證系統中的一個類只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。如果希望在系統中某個對象只能存在一個,單例模式是最好的解決方案。

單例模式的要點有三類

⑥ Python 單例模式問題求助 圖1和圖2有什麼區別嗎沒看出來

__new__方法才是用來創建對象的,__init__方法是對象創建完成後對對象進行初始化的,所以要實現單例模式應該重寫__new__方法,重寫__init__方法不能達到目的。

⑦ 單例模式中靜態變數初始化與不初始化有什麼區別

2.整個初始化順序是 類變數,類方法(如:static { System.out.print("ddd");}),對象變數,對象方法(如:{ System.out.print("ddd");})。大概是這樣,具體的記不清了,有興趣看看書。不好意思,請問為什麼counter2會被重新設置成0,而counter1不會?新手上路見笑了。 問題補充:watermud 寫道你輸出的結果,與 類和對象 的初始化順序有關。

閱讀全文

與python單例模式不初始化相關的資料

熱點內容
qt下編譯生成mqtt庫 瀏覽:541
南京中興招收專科程序員嗎 瀏覽:297
代理商php源碼 瀏覽:983
蘋果手機怎麼解壓軟體app 瀏覽:650
游戲資源被編譯 瀏覽:152
代碼編譯後黑屏 瀏覽:8
程序員情侶寫真 瀏覽:505
python3孿生素數 瀏覽:36
計算楊輝三角Python 瀏覽:404
linux目錄重命名 瀏覽:196
演算法設計的最終形態是代碼 瀏覽:262
程序員社團招新橫幅 瀏覽:238
拖鞋解壓視頻大全 瀏覽:887
租伺服器主機鏈接軟體叫什麼 瀏覽:856
交叉編譯工具的linux版本號 瀏覽:156
python開發應用軟體 瀏覽:32
hdl綜合器與c編譯器的區別 瀏覽:899
編譯原理最左推導代碼 瀏覽:702
加密三 瀏覽:131
通過編譯鏈接後形成的可執行程序 瀏覽:680