美文网首页
Python中的单例

Python中的单例

作者: 开心人开发世界 | 来源:发表于2019-11-26 16:19 被阅读0次

    通常,我们根据需要创建许多类的对象。有时,创建多个对象可能会占用大量资源。

    实际示例可以是数据库连接类。您不希望有多个数据库对象,因为一个对象的更改可能会使其他对象不一致。

    在这种情况下,我们可以使用单例模式。使用单例模式,我们确保一个类仅创建一个实例。

    有几个单例Python中经常使用的,其中包括NoneTrue,和False。事实None是,允许您比较None使用is关键字的单例情况。

    在Python中,创建单例模式的典型方法是使用装饰器。您可以阅读Python中的装饰器一文,以了解有关装饰器的更多信息。

    假设我们希望在应用程序的整个生命周期中建立一个数据库连接。让我们创建一个单例类来实现我们的目的。

    class Singleton:
    
        def __init__(self, cls):
            self._cls = cls
    
        def Instance(self):
            try:
                return self._instance
            except AttributeError:
                self._instance = self._cls()
                return self._instance
    
        def __call__(self):
            raise TypeError('Singletons must be accessed through `Instance()`.')
    
        def __instancecheck__(self, inst):
            return isinstance(inst, self._cls)
    

    现在,创建数据库连接类:

    @Singleton
    class DBConnection(object):
    
        def __init__(self):
            """Initialize your database connection here."""
            pass
    
        def __str__(self):
            return 'Database connection object'
    

    让我们访问此连接类:

    c1 = DBConnection.Instance()
    c2 = DBConnection.Instance()
    
    print("Id of c1 : {}".format(str(id(c1))))
    print("Id of c2 : {}".format(str(id(c1))))
    
    print("c1 is c2 ? " + str(c1 is c2))
    

    输出:

    Id of c1 : 139699882512960
    Id of c2 : 139699882512960
    c1 is c2 ? True
    

    如果执行以下操作,我们将得到TypeError

    try:
        p = DBConnection()
    except TypeError as ex:
        print("ERROR: {}".format(ex.message))
    

    我希望本文能帮助您在任何类中实现单例模式。

    翻译自:https://medium.com/better-programming/singleton-in-python-5eaa66618e3d

    相关文章

      网友评论

          本文标题:Python中的单例

          本文链接:https://www.haomeiwen.com/subject/uiqywctx.html