python3 单例模式

发布于 2022-09-06 00:13:17 字数 759 浏览 33 评论 0

在使用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方法怎么实现单例模式?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

旧人九事 2022-09-13 00:13:18
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运行成功,你如果不成功可以试一下注释

べ映画 2022-09-13 00:13:18

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

面犯桃花 2022-09-13 00:13:18
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 测试通过

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文