單例模式init問題及解決

2021-10-02 03:42:03 字數 2455 閱讀 9348

問題

class dog(object):

__instane = none

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

if cls.__instane == none:

cls.__instane = object.__new__(cls)

return cls.__instane

else:

return cls.__instane

def __init__(self, name):

self.name = name

dog1 = dog("旺財")  # 建立了dog物件,並呼叫__init__方法,初始化 旺財

print(dog1.name)

dog2 = dog("哮天犬")  # 使用dog物件,並呼叫__init__方法,重新初始化哮天犬

print(dog2.name)

print(dog1.name)  # 已經被重新初始化為哮天犬

"""建立物件一次,但是初始化了兩次,也就是__init__方法執行力兩次

dog旺財

哮天犬哮天犬

"""class dog(object):

__instane = none

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

if cls.__instane == none:

cls.__instane = object.__new__(cls)

return cls.__instane

else:

return cls.__instane

def __init__(self, name):

self.name = name

dog1 = dog("旺財")  # 建立了dog物件,並呼叫__init__方法,初始化 旺財

print(dog1.name)

dog2 = dog("哮天犬")  # 使用dog物件,並呼叫__init__方法,重新初始化哮天犬

print(dog2.name)

print(dog1.name)  # 已經被重新初始化為哮天犬

"""建立物件一次,但是初始化了兩次,也就是__init__方法執行力兩次

dog旺財

哮天犬哮天犬

"""解決

class dog(object):

__instane = none

__init__flag = false

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

if cls.__instane == none:

cls.__instane = object.__new__(cls)

return cls.__instane

else:

return cls.__instane

def __init__(self, name):  # 加個類屬性,就很容易解決啦

if self.__init__flag == false:

self.__init__flag = true

self.name = name

dog1 = dog("旺財")  # 建立了dog物件,並呼叫__init__方法,初始化 旺財

print(dog1.name)

dog2 = dog("哮天犬")  # 使用dog物件,並呼叫__init__方法,重新初始化哮天犬

print(dog2.name)

print(dog1.name)  # 已經被重新初始化為哮天犬

"""旺財

旺財旺財

"""class dog(object):

__instane = none

__init__flag = false

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

if cls.__instane == none:

cls.__instane = object.__new__(cls)

return cls.__instane

else:

return cls.__instane

def __init__(self, name):  # 加個類屬性,就很容易解決啦

if self.__init__flag == false:

self.__init__flag = true

self.name = name

dog1 = dog("旺財")  # 建立了dog物件,並呼叫__init__方法,初始化 旺財

print(dog1.name)

dog2 = dog("哮天犬")  # 使用dog物件,並呼叫__init__方法,重新初始化哮天犬

print(dog2.name)

print(dog1.name)  # 已經被重新初始化為哮天犬

"""旺財

旺財旺財

"""

單例模式,解決單例破壞。

破壞單例模式的三種方法 執行緒安全情況下 單例模式有 3 個特點 單例類只有乙個例項物件 該單例物件必須由單例類自行建立 單例類對外提供乙個訪問該單例的全域性訪問點。單例模式的優點和缺點 單例模式的優點 單例模式可以保證記憶體裡只有乙個例項,減少了記憶體的開銷。可以避免對資源的多重占用。單例模式設定...

java多執行緒 單例設計模式的問題及解決

單例設計模式 餓漢式 class single public static single getinstance 懶漢式 懶漢式後載入初始化物件,如果多執行緒則出現安全問題 會new n多物件 如果使用同步,會出現效率低下。使用同步 塊的雙重判斷來解決效率問題。靜態同步方法的鎖是該位元組碼物件 類名...

單例模式及面試

指乙個類只有乙個例項 需要 1 私有的構造方法,使其不能在類的外部通過new關鍵字例項化該類物件。2 私有的靜態例項化物件,並且將其封裝為private static型別。3 對外提供乙個公共的訪問方法,並返回該例項物件。第 1 種 餓漢式 立即載入 餓漢式就是 使用類的時候已經將物件建立完畢 不管...