@mkone112
Начинающий питонист.

Как переопределить сигнатуру __new__ метакласса для добавления значений по умолчанию?

class Meta(type):
    def __new__(mcs, name, bases, dct=None):
        if not dct:
            dct = {}
        return super().__new__(mcs, name, bases, dct)
    def __init__(self, name, bases, dct):
        pass

Meta('NewClassName', tuple())

выдает
type.__new__() takes exactly 3 arguments (2 given)

Мне в голову не пришло ничего лучше:
class Meta(type):
    def __new__(mcs, name, bases, *args, **kwargs):
        if not args and not kwargs:
            args = (dict(),)
        return super().__new__(mcs, name, bases, *args)
    def __init__(self, name, bases, *args, **kwargs):
        pass

Meta('NewClassName', tuple())

Вопрос: можно ли сделать это более кратко?
  • Вопрос задан
  • 45 просмотров
Пригласить эксперта
Ответы на вопрос 1
@mkone112 Автор вопроса
Начинающий питонист.
class Meta(type):
    @classmethod
    def __prepare__(metacls, name, bases):
        ...
    def __new__(mcs, name, bases, dct=None):
        if not dct:
            dct = {}
        return super().__new__(mcs, name, bases, dct)

Meta('NewClassName', tuple())

Хотя я решил вопрос используя __init_subclass__
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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