Python reload 对单例对象的影响

2021-01-23 17:23:30 +08:00
 towry
假如在 python 中使用了单例模式,维护了一个变量,那么在模块被 reload 后,这个变量会变吗?
1892 次点击
所在节点    Python
2 条回复
hareandlion
2021-01-23 21:54:42 +08:00
这要看单例模式的对象是在哪里创建的了吧,一般情况下单例模式所引用的对象是在被 reload 的 module 里初始化的,那 reload 会创建新的对象,而如果单例引用的是存在内存里类似 int 的基本类型对象,reload 之后依然会引用原本的对象。

si_cls.py
```
#!/bin/python
# coding: utf-8

ph = {'ab': 2}
# ph = 32


class SI:
def __new__(cls, *args, **kwargs):
return ph

def id(self):
return id(self)


si_instance = SI()
```

test.py
```
#!/bin/python
# coding: utf-8

import si_cls
from importlib import reload

s1 = si_cls.SI()
s2 = si_cls.SI()

print(f'id(s1)={id(s1)}, id(s2)={id(s2)}, id(si_instance)={id(si_cls.si_instance)}')

reload(si_cls)

s1 = si_cls.SI()
s2 = si_cls.SI()

print(f'id(s1)={id(s1)}, id(s2)={id(s2)}, id(si_instance)={id(si_cls.si_instance)}')

```
abersheeran
2021-01-24 01:56:17 +08:00
巧了。以前研究过相关的东西写了一篇博客留作记录。你看看吧。https://aber.sh/articles/Python-Reload/

当时写的可能比较乱,如果有没看懂的部分可以文章下发评论问。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/747713

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX