python设计模式 - 单例模式元类

2019-02-11  本文已影响28人  RedGecko

python 环境

python==3.7.2

简介

元类是一个类的类,也就是说该类是它的元类的实例。类的定义由它的元类决定,通过元类,程序员可以创建自定义类。在 python 中一切皆为对象。比如 a = 5, 则 type(a) 返回 <type 'int'>,这意味着变量 a 为 int 类型,如果继续 type(int) 则返回 <type 'type'>,同理这意味着 int 为 type 类。此时,type 类即为 int 类的元类。

元类基础用法

class MyInt(type):
    def __call__(cls, *args, **kwargs):
        return type.__call__(cls, *args, **kwargs)


class NewInt(metaclass=MyInt):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return str(self.x + self.y)


if __name__ == '__main__':
    a = NewInt(4, 5)
    print(a)

元类与单例

元类是类的类,即元类控制着类的实例化。借此,可以实现类的单例模式。

元类实现单例模式

import sqlite3


class MetaSingleton(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


class Database(metaclass=MetaSingleton):
    connection = None

    def connect(self):
        if not self.connection:
            self.connection = sqlite3.connect('db.sqlite3')
        return self.connection.cursor()


if __name__ == '__main__':
    db1 = Database().connect()
    db2 = Database().connect()
    print(db1)
    print(db2)
上一篇下一篇

猜你喜欢

热点阅读