python设计模式之单例模式

python设计模式之单例模式,第1张

概述一.理解单例模式 单例模式是一种创建型设计模式,它确保一个类有且只有一个特定类型的对象,并提供全局访问点。其意图为: 确保类有且只有一个对象被创建 为对象提供一个访问点,使程序可以全局访问该对象 控制

<div data-md-url="https://i.cnblogs.com/Editposts.aspx?postID=10022283">
<h1 ID="-" >一.理解单例模式
<blockquote >
<p >单例模式是一种创建型设计模式,它确保一个类有且只有一个特定类型的对象,并提供全局访问点。其意图为:


<ul >
<li >
<p >确保类有且只有一个对象被创建

 :     :          hasattr(cls,):            cls.instance=super(Singleton,cls).__new__(cls)         cls.instance

a=Singleton()
b=Singleton()
print(a)<span >#<main.Singleton object at 0x00000220866EF400>
print(b)<span >#<main.Singleton object at 0x00000220866EF400>


<p >new方法为python实例化创建对象自动执行的函数,通过重写这个函数,使之先判断该类中是否有instance属性(利用反射),若没有则为创建一个对象并为该属性赋值,最后返回instance中的对象。通过这种方式我们实现了每次创建实例返回的都是类中的instance的值。


<h3 ID="2-" >2.懒汉式实例化

 :    __instance=     :                 :          cls.__instance:            cls.__instance = Singleton()         cls.__instance

a=Singleton.getInstance()<span >#<main.Singleton object at 0x000001C85C114B38>
b=Singleton.getInstance()<span >#<main.Singleton object at 0x000001C85C114B38>
print(a)
print(b)


<p >我觉得这种方式最好理解,感觉像是手动完成单例创建逻辑,但注意获得实例一定要调用Singleton.getInstance()方法,直接a=Singleton()相当于没用单例。


<h3 ID="3-" >3.基于元类的单例实现

 :    __instance={}     :         self   @R_301_6135@Singleton.__instance:            @R_301_6135@Singleton.__instance[self] = super(@R_301_6135@Singleton,self).__call__()         @R_301_6135@Singleton.__instance[self]

<span ><span >class <span >Singleton<span >(@R_3016135@class=@R301_6135@Singleton):
<span ><span >def <span >init<span >(self):
<span >pass

a=Singleton()<span >#<main.Singleton object at 0x0000025103984CC0>
b=Singleton()<span >#<main.Singleton object at 0x0000025103984CC0>
print(a)
print(b)


<p >执行Singleton()之后,首先会调用@R_301_6135@Singleton中的call函数,如果Singleton类没有在instance中,则为其创建一个实例,也就是正常调用type中的call函数,将返回的对象存在instance中,以该类名为键,对象为值,最后返回这个对象,若instance中有该类,那就直接返回存储的对象。


<p >这种方式我觉得较好,不用为每个类单独创建单例模式,只需将元类重写即可


<h1 ID="-" >三.单例模式的缺点
<ul >
<li >
<p >全局变量可能在某处被修改,但开发人员仍然认为他们没有发生变化

 :    _shared_state={}     :        self.x=        self.__dict__=self._shared_state

a=Monostate()
b=Monostate()
b.x=<span >5
print(a)<span >#<main.Monostate object at 0x000001C267714B38>
print(b)<span >#<main.Monostate object at 0x000001C267714B00>
print(a.x)<span >#5
a.c=<span >4
print(b.c)<span >#4


<p >这里的实现方式为利用类中的dict方法,我感觉是将_shared_state赋给dict后,每个对象的dict的地址都是相同的,所以对象的属性存储的位置都相同,那么一个对象的属性变化,其余的属性也会发生变化。

<p >参考《python设计模式(第2版)》


<div title="MDH:PHA+I+S4gC7nkIbop6PljZXkvovmqKHlvI88L3A+PHA+Jmd0O+WNleS+i+aooeW8j+aYr+S4gOen
jeWIm+W7uuWei+iuvuiuoeaooeW8j++8jOWug+ehruS/nes4gOS4quexu+acIES4lOWPquacIES4
gOS4queJueWumuexu+Wei+eahOWvueixoe+8jOW5tuaPkOS+m+WFqOWxgOiuv+mXrueCueOAguwf
tuaEj+WbvuS4uu+8mjwvcD48cD4mZ3Q7ICog56Gu5L+d57G75pyJ5liU5Y+q5pyJ5liA5liq5a+5
6LGh6KKr5Yib5bu6PC9wPjxwPiZndDsqIOS4uuWvueixoeaPkOS+m+S4gOS4quiuv+mXrueCue+8
jOS9v+eoi+W6j+WPr+S7peWFqOWxgOiuv+mXruivpeWvueixoTwvcD48cD4mZ3Q7KIDmjqfliLbl
hbHkuqvotYTmupDnmoTlubbooYzorr/pl648L3A+PHA+PGJyIGRhdGEtbWNlLWJvZ3VzPSIxIj48
L3A+PHA+566A5Y2V55CG6Kej77ya5Y2V5L6L5Y2z5li65Y2V5liq5a6e5L6L77yM5Lmf5bCx5piv
5q+P5qyh5a6e5L6L5YyW5Yib5bu65a+56LGh5pe26I635b6X55qE6YO95piv5ZCM5liA5liq5a+5
6LGh77yM5b2T54S25ZCM5liA5liq5a+56LGh55qE5bGe5oCn6YO95piv55u45ZCM55qE77yM5pa5
5rOV5Lmf5piv55u45ZCM55qE77yM5Zyw5Z2A5Lmf5piv55u45ZCM55qE77yM6L+Z5qC357uZ5oiR
5Lus5bim5p2l55qE5aW95aSE5bCx5piv5Y+v5Lul6YG/5YWN5raI6ICX6L+H5aSa55qE5YaF5a2Y
5oiWQ1BV6LWE5rqQ77yM5L6L5aaC5pWw5o2u5bqT57G777yM5oiR5Lus5biM5pyb5q+P5qyh6YO9
5L2/55So5ZCM5liA5liq5pWw5o2u5bqT5a+56LGh5p2l5a+55pWw5o2u5bqT6L+b6KGM5pON5L2c
77yM5Lul57u05oqk5pWw5o2u55qE5liA6IE05oCn44CC5Y+I5aaC5qih5Z2X55qE5a+85YWl77yM
5aaC5p6c5rKh5pyJ5a+85YWl6K+l5qih5Z2X77yM5YiZ5a+85YWl6K+l5qih5Z2X5bm25a6e5L6L
5YyW77yM5aaC5p6c5bey57uP5a+85YWl77yM5YiZ6L+U5Zue6K+l5qih5Z2X55qE5a+56LGhPC9w
PjxwPiPkuowucHl0aG9u5a6e546w5Y2V5L6L5qih5byPPC9wPjxwPiMjIzEu5Z+65LqOX19uZXdf
X+aWueazleWunueOsOeahOWNleS+i+aooeW8jzwvcD48cD5gYGBweXRob248L3A+PHByZT5jbGFz
cyBTaW5nbGV0b24oKTo8YnI+ICAgIGRlZiBfX25ld19fKGNscywgKmFyZ3MsICoqa3dhcmdzKTo8
YnI+ICAgICAgICBpZiBub3QgaGFzYXR0cihjbHMsJ2luc3RhbmNlJyk6PGJyPiAgICAgICAgICAg
IGNscy5pbnN0YW5jZT1zdXBlcihTaW5nbGV0b24sY2xzKS5fX25ld19fKGNscyk8YnI+ICAgICAg
ICByZXR1cm4gY2xzLmluc3RhbmNlPGJyPjxicj5hPVNpbmdsZXRvbigpPGJyPmI9U2luZ2xldG9u
KCk8YnI+cHJpbnQoYSkjJmx0O19fbWFpbl9fLlNpbmdsZXRvbiBvYmplY3QgYXQgMHgwMDAwMDIy
MDg2NkVGNDAwJmd0Ozxicj5wcmludChiksMmbHQ7X19tYWluX18uU2luZ2xldG9uIG9iamVjdCBh
dCAweDAwMDAwMjIwODY2RUY0MdamZ3Q7PC9wcmU+PHA+YGBgPGJyPjwvcD48cD5uZXfmlrnms5Xk
ulpweXRob27lrp7kvovljJbliJvlu7rlr7nosaHoh6rliqjmiafooYznmoTlh73mlbDvvIzpgJro
v4fph43lhpnov5nkuKrlh73mlbDvvIzkvb/kuYvlhYjliKTmlq3or6XnsbvkuK3mmK/lkKbmnIlp
bnN0YW5jZeWxnuaAp++8iOWIqeeUqOWPjeWwhO+8IE+8jOiLpeayoeacIEWImeS4uuWIm+W7uuS4
gOS4quWvueixoeW5tuS4uuivpeWxnuaAp+i1i+WAvO+8jOacgOWQjui/lOWbnmluc3RhbmNl5lit
55qE5a+56LGh44CC6YCa6L+H6L+Z56eN5pa55byP5oiR5Lus5a6e546w5LqG5q+P5qyh5Yib5bu6
5a6e5L6L6L+U5Zue55qE6YO95piv57G75lit55qEaW5zdGFuY2XnmoTlgLzjgII8L3A+PHA+IyMj
Mi7mh5LmsYnlvI/lrp7kvovljJY8L3A+PHA+YGBgcHl0aG9uPC9wPjxwcmU+Y2xhc3MgU2luZ2xl
dG9uKCk6PGJyPiAgICBfX2luc3RhbmNlPU5vbmU8YnI+ICAgIGRlZiBfX2luaXRfXyhzZWxmKTo8
YnI+ICAgICAgICBwYXNzPGJyPiAgICBAY2xhc3NtZXRob2Q8YnI+ICAgIGRlZiBnZXRJbnN0YW5j
ZShjbHMpOjxicj4gICAgICAgIGlmIG5vdCBjbHMuX19pbnN0YW5jZTo8YnI+ICAgICAgICAgICAg
Y2xzLl9faW5zdGFuY2UgPSBTaW5nbGV0b24oKTxicj4gICAgICAgIHJldHVybiBjbHMuX19pbnN0
YW5jZTxicj48YnI+YT1TaW5nbGV0b24uZ2V0SW5zdGFuY2UoKSMmbHQ7X19tYWluX18uU2luZ2xl
dG9uIG9iamVjdCBhdCAweDAwMDAwMUM4NUMxMTRCMzgmZ3Q7PGJyPmI9U2luZ2xldG9ulmdldElu
c3RhbmNlKCkjJmx0O19fbWFpbl9fLlNpbmdsZXRvbiBvYmplY3QgYXQgMHgwMDAwMDFDODVDMTE0
QjM4Jmd0Ozxicj5wcmludChhKTxicj5wcmludChiKTwvcHJlPjxwPmBgYDWvcD48cD7miJHop4nl
vpfov5nnp43mlrnlvI/mnIDlpb3nkIbop6PvvIzmhJ/op4nlg4/mmK/miYvliqjlrozmiJDljZXk
vovliJvlu7rpgLvovpHvvIzkvYbms6jmhI/Ojrflvpflrp7kvovkuIDlrpropoHosIPnlKhTaW5n
bGV0b24uZ2V0SW5zdGFuY2UoKeaWueazle+8jOebtOaOpWE9U2luZ2xldG9uKCnnm7jlvZPkuo7m
sqHnlKjljZXkvovjgII8L3A+PHA+IyMjMy7ln7rkuo7lhYPnsbvnmoTljZXkvovlrp7njrA8L3A+
PHA+YGBgcHl0aG9uPC9wPjxwcmU+Y2xhc3MgTWV0YVNpbmdsZXRvbih0eXBlKTo8YnI+ICAgIF9f
aW5zdGFuY2U9e308YnI+ICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOjxi
cj4gICAgICAgIGlmIHNlbGYgbm90IgluIE1ldGFTaW5nbGV0b24uX19pbnN0YW5jZTo8YnI+ICAg
ICAgICAgICAgTWV0YVNpbmdsZXRvbi5fX2luc3RhbmNlW3NlbGZdID0gc3VwZXIoTWV0YVNpbmds
ZXRvbixzZWxmKS5fX2NhbGxfXygpPGJyPiAgICAgICAgcmV0dXJuIE1ldGFTaW5nbGV0b24uX19p
bnN0YW5jZVtzZWxmXTxicj48YnI+Y2xhc3MgU2luZ2xldG9uKG1ldGFjbGFzcz1NZXRhU2luZ2xl
dG9uKTo8YnI+ICAgIGRlZiBfX2luaXRfXyhzZWxmKTo8YnI+ICAgICAgICBwYXNzPGJyPjxicj5h
PVNpbmdsZXRvbigpIyZsdDtfX21haW5fXy5TaW5nbGV0b24gb2JqZWN0IGF0IDB4MDAwMDAyNTEw
Mzk4NENDMCZndDs8YnI+Yj1TaW5nbGV0b24oKSMmbHQ7X19tYWluX18uU2luZ2xldG9uIG9iamVj
dCBhdCAweDAwMDAwMjUxMDM5ODRDQzAmZ3Q7PGJyPnByaW50KGEpPGJyPnByaW50KGIpPC9wcmU+
PHA+YGBgPC9wPjxwPuaJp+ihjFNpbmdsZXRvbigp5LmL5ZCO77yM6aaW5YWI5Lya6LCD55SoTWV0
YVNpbmdsZXRvbuS4reeahGNhbGzlh73mlbDvvIzlpolmnpxTaW5nbGV0b27nsbvmsqHmnInlnKhp
bnN0YW5jZeS4re+8jOWImeS4uuwftuWIm+W7uuS4gOS4quWunuS+i++8jOS5n+WwseaYr+ato+W4
uOiwg+eUqHR5cGXkuK3nmoRjYWxs5Ye95pWw77yM5bCG6L+U5Zue55qE5a+56LGh5a2Y5ZyoaW5z
dGFuY2XkuK3vvIzku6Xor6XnsbvlkI3kulrplK7vvIzlr7nosaHkulrlgLzvvIzmnIDlkI7ov5Tl
m57ov5nkuKrlr7nosaHvvIzoi6VpbnN0YW5jZeS4reacIEivpeexu++8jOmCo+WwseebtOaOpei/
lOWbnuWtmOWCqOeahOWvueixoeOAgjwvcD48cD7ov5nnp43mlrnlvI/miJHop4nlvpfovoPlpb3v
vIzkuI3nlKjkulrmr4/kuKrnsbvljZXni6zliJvlu7rljZXkvovmqKHlvI/vvIzlj6rpnIDlsIbl
hYPnsbvph43lhpnljbPlj688L3A+PHA+I+S4iS7ljZXkvovmqKHlvI/nmoTnvLrngrk8L3A+PHA+
KIDlhajlsYDlj5jph4/lj6/og73lnKjmn5DlpITooqvkv67mlLnvvIzkvYblvIDlj5HkurrlkZjk
u43nhLborqTkulrku5bku6zmsqHmnInlj5HnlJ/lj5jljJY8L3A+PHA+KIDkvJrlr7nlkIzkuIDk
uKrlr7nosaHliJvlu7rlpJrkuKrlvJXnlKg8L3A+PHA+KIDmiYDmnInnsbvpg73kvp3otZblkIzk
uIDkuKrlhajlsYDlj5jph4/vvIzpgqPkuYjku5bku6zliJnlj5jnmoTntKflr4bogKblkIg8L3A+
PHA+PGJyIGRhdGEtbWNlLWJvZ3VzPSIxIj48L3A+PHA+I+Wbmy5Nb25vc3RhdGXljZXmgIHmqKHl
vI88L3A+PHA+6L+Z56eN5qih5byP55qE55CG5b+15li677ya5a6e5L6L5YyW55qE5a+56LGh5piv
5liN5ZCM55qE77yM5L2G5piv5a+56LGh55qE54q25oCB77yM5bGe5oCn5piv55u45ZCM55qE77yM
5Lmf5bCx5piv5Y2V5oCB5qih5byP44CCPC9wPjxwPmBgYHB5dGhvbjwvcD48cHJlPmNsYXNzIE1v
bm9zdGF0ZSgpOjxicj4gICAgX3NoYXJlZF9zdGF0ZT17fTxicj4gICAgZGVmIF9faW5pdf9fKHNl
bGYpOjxicj4gICAgICAgIHNlbGYueD0xPGJyPiAgICAgICAgc2VsZi5fX2RpY3RfXz1zZWxmLl9z
aGFyZWRfc3RhdGU8YnI+PGJyPmE9TW9ub3N0YXRlKCk8YnI+Yj1Nb25vc3RhdGUoKTxicj5iLng9
NTxicj5wcmludChhKSMmbHQ7X19tYWluX18uTW9ub3N0YXRliG9iamVjdCBhdCAweDAwMDAwMUMy
Njc3MTRCMzgmZ3Q7PGJyPnByaW50KGIpIyZsdDtfX21haW5fXy5Nb25vc3RhdGUgb2JqZWN0IGF0
IDB4MDAwMDAxQzI2NzcxNEIwMCZndDs8YnI+cHJpbnQoYS54KSM1PGJyPmEuYz00PGJyPnByaW50
KGIuYykjNDWvcHJlPjxwPmBgYDWvcD48cD7ov5nph4znmoTlrp7njrDmlrnlvI/kulrliKnnlKjn
sbvkuK3nmoRkaWN05pa55rOV77yM5oiR5oSf6KeJ5piv5bCGX3NoYXJlZF9zdGF0Zei1i+e7mWRp
Y3TlkI7vvIzmr4/kuKrlr7nosaHnmoRkaWN055qE5Zyw5Z2A6YO95piv55u45ZCM55qE77yM5omA
5Lul5a+56LGh55qE5bGe5oCn5a2Y5YKo55qE5L2N572u6YO955u45ZCM77yM6YKj5LmI5liA5liq
5a+56LGh55qE5bGe5oCn5Y+Y5YyW77yM5YW25L2Z55qE5bGe5oCn5Lmf5Lya5Y+R55Sf5Y+Y5YyW
44CCPC9wPjxwPjxiciBkYXRhLW1jZS1ib2d1cz0imsI+PC9wPjxwPioqKjwvcD48cD7lj4LogIPj
gipweXRob27orr7orqHmqKHlvI/vvIjnrKwy54mI77yJ44CLPC9wPjxwPjxiciBkYXRhLW1jZS1i
b2d1cz0imsI+PC9wPg==">​

总结

以上是内存溢出为你收集整理的python设计模式之单例模式全部内容,希望文章能够帮你解决python设计模式之单例模式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1208204.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存