- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我看到了这个 Borg 单例模式代码,但我无法理解我添加到单例对象的新成员是如何附加到 __shared_state = {}
字典的。
这是单例代码
class Borg(object):
_shared_state = {}
def __new__(cls,*args,**kwargs):
obj = super(Borg,cls).__new__(cls,*args,**kwargs)
obj.__dict__ = cls._shared_state
return obj
class Child(Borg):
pass
if __name__ == '__main__':
borg = Borg()
another_borg = Borg()
print borg is another_borg
child = Child()
borg.only_one_var = "I'm the only one var"
print child.only_one_var
所以我的问题是,当创建对象 borg.only_one_var
时,它是如何附加到 _shared_state
字典中的
最佳答案
默认情况下,每个实例都有自己的字典,因此将属性分配给一个实例不会影响其他实例。
但是你可以让一个实例的字典指向一个新的字典,当你在内部这样做时,它将被用来存储项目。
在您的例子中,每次创建一个实例时,您都将其字典分配给一个 Borg。 _shared_state
。因此,它的所有实例都将使用相同的字典来获取和设置属性。
它基本上等同于:
shared = {}
class A(object):
def __init__(self):
self.__dict__ = shared
演示:
>>> ins = [A() for _ in range(5)]
>>> ins[0].x = 100
>>> for i in ins:
... print(i.x)
...
100
100
100
100
100
>>> shared
{'x': 100}
在 CPython 中,将新字典分配给 __dict__
发生在 PyObject_GenericSetDict
中。 :
int
PyObject_GenericSetDict(PyObject *obj, PyObject *value, void *context)
{
PyObject **dictptr = _PyObject_GetDictPtr(obj);
...
if (!PyDict_Check(value)) {
PyErr_Format(PyExc_TypeError,
"__dict__ must be set to a dictionary, "
"not a '%.200s'", Py_TYPE(value)->tp_name);
return -1;
}
Py_INCREF(value);
Py_XSETREF(*dictptr, value); # Set the dict to point to new dict
return 0;
}
请注意,自 key-sharing dictionaries 到达以来在 Python 3.3+ 中,同一类实例的字典可以共享一些内部状态以节省空间。
关于python - 理解 Python 中的 Borg 单例模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45312657/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!