Python 中, 仿照经典代码实现单例, 却出现了不是单例的的状态, 代码哪里出错了 ?

2017-03-08 20:14:08 +08:00
 wentian

https://segmentfault.com/q/1010000008617728

1870 次点击
所在节点    Python
14 条回复
junnplus
2017-03-08 20:21:09 +08:00
python 中直接模块级常量就是单例
wentian
2017-03-08 20:27:41 +08:00
@junnplus 我的第一处代码是仿照经典实现, 而且自己也看不少书, 都是推荐这种写法

我的疑惑在于: 是不是我写错了 ?
Kilerd
2017-03-08 20:38:09 +08:00
单例模式 建议用 __new__,不是用 __init__
amoyiki
2017-03-08 20:48:25 +08:00
应该用__new__只创建一个实例
junnplus
2017-03-08 20:56:36 +08:00
@wentian 你这是那里看到的推荐写法,“看了不少书”?你可以列出书名。另外楼上都是正解
junnplus
2017-03-08 20:57:35 +08:00
你这种写法只是共用一个类变量,但是每次都实例化 BackgroundScheduler
mooncakejs
2017-03-08 20:59:51 +08:00
@junnplus 正解。
junnplus
2017-03-08 21:00:42 +08:00
还有,看了你给的链接 https://github.com/faif/python-patterns/blob/master/creational/borg.py
人家写的没错,通过继承共用类变量来实现单例
wentian
2017-03-08 21:33:24 +08:00
@junnplus
是不是我还要继承下( 我原以为那个继承, 就是做做样子的, 直接使用基类不就完了 :P )
但是, 如果我使用 str 之类的, 就和他的完全保持一致了



使用 __new__ , 见过, 但是没有深入了解其原理过


清一色的 Borg 推荐: https://www.google.com/search?q=python+singleton&oq=python+singleton+&aqs=chrome..69i57.6145j0j7&sourceid=chrome&ie=UTF-8


但是都加了一个继承, 看起来那个继承, 不是我认为「多余的」


:P
wentian
2017-03-08 21:35:44 +08:00
@junnplus

反正各种解决方法就是了, 大家也木有一个统一的意见, 貌似也木有最佳实践了
junnplus
2017-03-08 21:55:47 +08:00
@wentian python 中最佳实践就是模块级常量
dsg001
2017-03-08 22:16:40 +08:00
模块,简单安全
jingniao
2017-03-08 22:52:39 +08:00
模块变量,简单的多线程锁就这么干的,跑的挺欢的
lunaticus7
2017-03-09 15:15:24 +08:00
可以试下这个单例装饰器,定义类的时候加在前面就行

#!/usr/bin/env python
# -*- coding: utf-8 -*-


class SingletonDecorator:
def __init__(self, klass):
self.klass = klass
self.instance = None

def __call__(self, *args, **kwds):
if self.instance is None:
self.instance = self.klass(*args, **kwds)
return self.instance

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

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

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

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

© 2021 V2EX