python3 单例模式

在使用python2例子的__new__实现单例模式时候,
class Singleton(object):

__instance = None

def __new__(cls, *args, **kwargs):
    if cls.__instance is None:
        cls.__instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
    return cls.__instance
def __init__(self, status_number):
    self.status_number = status_number

s1 = Singleton(2)
s2 = Singleton(5)
print (s1)
print (s2)
print(s1.status_number)
print(s2.status_number)

别人用python2实现的,现在我用python3.6运行这段代码错误
错误信息:
in __new__cls.__instance = super(Singleton, cls).__new__(cls, args, *kwargs)
TypeError: object() takes no parameters

问题

1:想问一下为什么2.7运行没问题,3.6出错呢?2.7和3.6的object不同吗?
2:如果用python3.6 的new方法怎么实现单例模式?

阅读 5.9k
3 个回答
class Singleton(object):
    __instance = None
    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            # cls.__instance = super().__new__(cls)
            # cls.__instance = object.__new__(cls)
            cls.__instance = super(Singleton, cls).__new__(cls)
        return cls.__instance
    
    def __init__(self, status_number):
        self.status_number = status_number

我的windows+python3.5运行成功,你如果不成功可以试一下注释

感谢回答,把args 和*kwargs删除确实可以,不过为什么呢?这两个代表任意参数为什么会有影响?

class Singleton(object):
    __instance = None
    def __init__(self):
        pass
    def __new__(cls, *args, **kwd):
        if Singleton.__instance is None:
            Singleton.__instance = object.__new__(cls, *args, **kwd)
        return Singleton.__instance

Python 3.5.2 测试通过

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题