python設計モード-単一モードメタクラス

1429 ワード

python環境
python==3.7.2

概要
メタクラスはクラスのクラスであり、すなわちクラスはそのメタクラスのインスタンスである.クラスの定義はそのメタクラスによって決まり、メタクラスを通じてプログラマはカスタムクラスを作成することができます.pythonではすべてがオブジェクトです.例えばa=5ではtype(a)が返され、これは変数aがintタイプであることを意味し、type(int)を続けると返され、同様に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)