Как указывать аргументы при инициализации класса, в котором указаны только аннотации типов?
Есть код
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)