python元类执行顺序及元类单例模式实现

以Server类为例:在定义好Server类的时候已经执行Enum的__new__方法和__init__方法,实例化Server类的时候才会执行Server类的__new__方法和__init__方法

单例模式:是在类实例化的时候会执行元类的__call__方法,我们在定义类的时候就已经执行了元类的__init__方法,从而确认定义类是否有__init__方法,如果有__init__方法,则根据参数生成key,如果没有__init__方法,则以类本身作为key

import collections


class Enum(type):
    _init={}

    def __init__(self,name,base,class_dict):
        super(Enum, self).__init__(name,base,class_dict)
        print(id(self))

    def __new__(cls, *args, **kwargs):
        c=super().__new__(cls,*args,**kwargs)
        print('enum')
        print(args,kwargs)
        print(id(cls),id(c))
        return c


class Server(object,metaclass=Enum):

    def __init__(self,host,port):
        self.host=host
        self.port=port

    def __new__(cls,*args,**kwargs):
        c=super().__new__(cls)
        print('Server')
        return c


class SingleMetaClass(type):
    _dct={}
    _init={}
    def __init__(self,class_name,base,class_dict):
        self._init[self]=class_dict.get('__init__',None)
        super(SingleMetaClass, self).__init__(class_name,base,class_dict)

    def __call__(self, *args, **kwargs):
        if self._init[self] is None:
            key=self
        else:
            key=(self,args,repr(kwargs))
        if self._dct.get(key) is None:
            self._dct[key]=super().__call__(*args,**kwargs)
        return self._dct[key]


class Coon(metaclass=SingleMetaClass):

    def __init__(self,a,b):
        print(a,b)


if __name__ == '__main__':
    Server('localhost','8000')
    print(Coon(1, b=2))
    print(Coon(1, b=2))
    print(Coon(1, 3))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个 Python 3.x 实现数据库连接池单例模式的例子,使用了线程安全的单例模式: ```python import sqlite3 from queue import Queue from threading import Lock class ConnectionPool: __instance = None __lock = Lock() @staticmethod def get_instance(): if ConnectionPool.__instance is None: with ConnectionPool.__lock: if ConnectionPool.__instance is None: ConnectionPool.__instance = ConnectionPool() return ConnectionPool.__instance def __init__(self, max_size=10, db_file=':memory:'): self.max_size = max_size self.db_file = db_file self.pool = Queue(maxsize=max_size) for _ in range(max_size): connection = sqlite3.connect(db_file) self.pool.put(connection) def get_connection(self): return self.pool.get() def release_connection(self, connection): self.pool.put(connection) ``` 在上面的例子中,`ConnectionPool` 是一个单例,它维护了一个 SQLite 数据库连接池。通过 `get_instance` 方法获取单例对象,通过 `get_connection` 方法从连接池中获取一个数据库连接,通过 `release_connection` 方法将连接释放回连接池。 在构造函数中,我们创建了一个指定大小的连接池,并将连接放入队列中。在 `get_connection` 方法中,我们从队列中获取连接,如果队列为空,则会阻塞,直到有可用连接为止。在 `release_connection` 方法中,我们将连接放回队列中。 使用单例模式,可以保证我们只有一个数据库连接池实例,避免了在多个地方同时创建数据库连接池实例的问题。同时,使用线程安全的单例模式,可以保证在多线程环境下,单例对象的创建过程是线程安全的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值