Задать вопрос
@artinnok
бекенд-программист

Как сделать перегрузку конструктора класса в Python?

Дан класс:
class Container:
    def __init__(self, a, b, c, d, e, f, g):
        self.a = a
        self.b = b
        self.c = c 
        self.d = d
        self.e = e
        self.f = f
        self.g = g

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

Чтобы вызов класса был таким:
obj1 = Container(a=1, b=2, c=3, d=4)
obj2 = Container(x=4, y=3)


Мой вариант такой, но он не рабочий:
class Container:
    def __init__(self, **kwargs):
        for key in kwargs:
            self.key = kwargs[key]


P.S. Желательно, реализация с именованными аргументами, но и с позиционными тоже приветствуется)

UPD:
Есть функция:
def get_data(request):
    a = request.POST['a']
    b = request.POST['b']
    c = request.POST['c']
    d = request.POST['d']
    e = request.POST['e']
    f = request.POST['f']
    cont = Container(a, b, c, d, e, f)
    return cont

Она используется для получения данных из POST запроса. Подумал, лучше передавать данные в экземпляре класса, чем делать return a, b, c, d, e, f. Потом, полученные данные обрабатываются дальше, к примеру, передаются в функцию:

Думаю, так лучше:
send_data(instanceOfContainer)

А так хуже:
send_data(a, b, c, d, e, f)

Количество полей, которые передаются POST запросом со временем будет увеличиваться и делать тысячу раз request.POST[key] не вариант. Как и расширять конструктор для класса Container с помощью self.x = x. Нужен способ делать это коротко и красиво. Поэтому я и спрашиваю про именованные и позиционные параметры переменной длины.
  • Вопрос задан
  • 9261 просмотр
Подписаться 1 Оценить 4 комментария
Пригласить эксперта
Ответы на вопрос 2
@idap
интересуюсь python, latex, linux, ML, AI
Я делал так:
class A(object):
    def __init__(self, **kwargs):
        for name, value in kwargs.items():
            setattr(self, name, value)

a = A(x=4, y=5)
Ответ написан
Комментировать
EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++
В языке Python нет такого "перегрузить конструктор". Есть один __init__ , а чтобы решить задачу с различными ситуациями делают несколько методов, к примеру : SuperPuperClass.build_situation1(), SuperPuperClass.build_situation2(). Можете почитать здесь: Python constructors and __init__
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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