Как указывать аргументы при инициализации класса, в котором указаны только аннотации типов?

Есть код

class Model(type):
    def __new__(cls, name, bases, namespace):
        return super().__new__(cls, name, bases, namespace)

class User(metaclass=Model):
    username: str
    password: str
    age: int

user1 = User('Alex', 'qwerty', 18)

Дальше следует ошибка:

Traceback (most recent call last):
  ...
    user1 = User('Alex', 'qwerty', 18)
TypeError: User() takes no arguments

Как заставить класс User принимать аргументы из аннотаций типов?

И есть ли возможность сделать мета-класс Model обычным классом и из него управлять дочерним классом? Под управлением я понимаю: получение названий атрибутов, их значений, названия класса.

Каким образом можно получить значение параметра в скобках класса? Пример:

class Hero(Model, table=True):
    pass

Именно значение table.

Спасибо.


Ответы (1 шт):

Автор решения: Roman-Stop RU aggression in UA

Все можно, это делается так:

class ModelMeta(type):
    def __new__(cls, name, bases, namespace, table=False, **kwargs):
        def init(self, *args):
            print(f"table={table}")
            for field, value in zip(namespace["__annotations__"], args):
                setattr(self, field, value)

        namespace["__init__"] = init
        return super().__new__(cls, name, bases, namespace)


class Model(metaclass=ModelMeta):
    pass


class User(Model, table=True):
    username: str
    password: str
    age: int


user1 = User("Alex", "qwerty", 18)

print(user1.username)
print(user1.password)
print(user1.age)
→ Ссылка