Конструктор для класса со многими атрибутами - PullRequest
0 голосов
/ 26 октября 2018

Как лучше всего написать конструктор, когда у вас есть класс с множеством атрибутов?

Например, в колледже мы получили фрагмент кода, в котором вы должны явно установить все атрибуты, когдаВы создаете объект.Я заметил, что некоторые из них используются только один раз в начале / конце.Поэтому я создал равный код, в котором я даю некоторые значения по умолчанию для редко используемых атрибутов и устанавливаю их вне объекта создания только в начале / конце.

Я хотел спросить, рекомендуется ли такой подход и существует лиобщий подход к созданию конструкторов для классов со многими атрибутами.

Вот упрощенная версия кода колледжа:

class point(object):
    def __init__(self,x,y,bonus,start_point,stop_point):
        self.x = x
        self.y = y
        self.bonus = bonus
        self.start_point = start_point
        self.stop_point = stop_point

        #some more attributes


if __name__ == '__main__':

    #some code here

    p = point(1,1,100,False,False)

    #some code here

Моя версия:

class point(object):
    def __init__(self,x,y,bonus):
        self.x = x
        self.y = y
        self.bonus = bonus
        self.start_point = False
        self.stop_point = False

        #some more attributes


if __name__ == '__main__':

    #some code here

    p = point(1,1,100)

    #some code here

    #start/stop points are 1 in n (n=10000) in the original code
    #so set these attributes once in the beggining/end
    p.start_point = False
    p.stop_point = True

1 Ответ

0 голосов
/ 26 октября 2018

Это не вопрос производительности или «как часто» он используется.Это вопрос интерфейса.

У вас есть класс, и он предоставляет интерфейс для создания объектов.Кто-то (может быть, даже вы сами) будет использовать это, чтобы сделать что-то.Вопрос в том, являются ли эти атрибуты частью конструктора объекта?Имеет ли смысл указывать эти значения при создании объекта?Имеет ли смысл даже давать пользователю возможность устанавливать его извне объекта?

Если имеет смысл задавать эти атрибуты при создании, но в большинстве случаев он будет иметь те же значения, предоставьте значения по умолчанию для параметра,но не устанавливайте его неявно, потому что вы по-прежнему делаете их частью общедоступного интерфейса:

class point(object):
    def __init__(self, x, y, bonus, start_point=False, stop_point=False):
        self.x = x
        self.y = y
        self.bonus = bonus
        self.start_point = start_point
        self.stop_point = stop_point

таким образом, вы можете опустить эти два аргумента и предоставить их, когда захотите.Но хорошо, что вы даете пользователям подсказку о том, что вы можете установить во время создания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...