rstJkee
@rstJkee

Как работает super().__call__()?

Есть код (паттерн синглтон)
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 self.connection is None:
            self.connection = sqlite3.connect("db.sqlite3")
            self.cursorobj = self.connection.cursor()
        return self.cursorobj
db1 = Database().connect()
db2 = Database().connect()
print ("Database Objects DB1", db1)
print ("Database Objects DB2", db2)

Что происходит на строке ниже?
cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)

Просто не совсем понятно, почему вызывается super с аргументами и что сделает __call__
  • Вопрос задан
  • 193 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Qai
Ну насколько я прожевал эту тему, то происходит следующее:
super(MetaSingleton, cls) - определяется информация из объекта `type`, т.е. супер берёт информацию из родительского класса.
Дальше в __call__(*args, **kwargs) там уже передаётся то, что было передано в классе MetaSingleton, но так как это всё вызывается из Database, то посути получается так:
self.connection = sqlite3.connect("db.sqlite3")
self.cursorobj = self.connection.cursor()

connection, cursorobj прокидываются в качестве *args

И в конце этот объект, который создался помещается в
cls._instances[cls]

я так понял
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы