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__
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
@bacon
Потому что это из-за "old-style class" синтаксиса.наврал, в python2 такой был, а в python3 super можно без аргументов. А __call__ это вызов объекта, т.е object_name()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы