有如下 borg pattern 的实现:
1
2
3
4
5
6
7
8
9
|
class borg( object ):
__shared_state = {}
def __init__( self ):
self .__dict__ = self .__shared_state
self .state = 'init'
def __str__( self ):
return self .state
|
之前一直看不懂为什么 borg class 要那样实现, 后来学到两个知识点后发现原来这么简单明了:
-
关于 __shared_state:
- 在 __init__(self, ) 外面定义的变量,是属于这个 class 的,并且由所有的 instance 共享的,而不是单属于某个instance; 在 __init__(self, ) 里面定义的变量,只属于这个 object instance (self) 本身。
-
关于 __dict__:
- 类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类__dict__里的;对象的__dict__中存储了一些self.xxx的一些东西
试着跑一下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
if __name__ = = '__main__' :
rm1 = borg()
rm2 = borg()
rm1.state = 'idle'
rm2.state = 'running'
print ( 'rm1: {0}' . format (rm1))
print ( 'rm2: {0}' . format (rm2))
rm2.state = 'zombie'
print ( 'rm1: {0}' . format (rm1))
print ( 'rm2: {0}' . format (rm2))
print ( 'rm1 id: {0}' . format ( id (rm1)))
print ( 'rm2 id: {0}' . format ( id (rm2)))
rm3 = yourborg()
print ( 'rm1: {0}' . format (rm1))
print ( 'rm2: {0}' . format (rm2))
print ( 'rm3: {0}' . format (rm3))
|
其结果为:
### output ###
# rm1: running
# rm2: running
# rm1: zombie
# rm2: zombie
# rm1 id: 140732837899224
# rm2 id: 140732837899296
# rm1: init
# rm2: init
# rm3: init
本文代码来自: https://github.com/faif/python-patterns/blob/master/patterns/creational/borg.py
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://segmentfault.com/a/1190000019390393