В Python, скажем, у меня есть класс, Circle, который наследуется от Shape. Форма нуждается в координатах x и y, и, кроме того, Circle нуждается в радиусе. Я хочу, чтобы иметь возможность инициализировать круг делать что-то подобное,Является ли я .__ dict __. Обновление (** kwargs) хорошего или плохого стиля?
c = Circle(x=1., y=5., r=3.)
Circle наследует от формы, так что мне нужно использовать именованные аргументы __init__
, потому что разные классы требуют различных конструкторов. Я мог бы вручную установить x, y и r.
class Shape(object):
def __init__(self, **kwargs):
self.x = kwargs['x']
self.y = kwargs['y']
class Circle(Shape):
def __init__(self, **kwargs):
super(Circle, self).__init__(**kwargs)
self.r = kwargs['r']
или, я мог бы иметь атрибуты моего круга автоматически обновляется с помощью self.__dict__.update(kwargs)
class Shape(object):
def __init__(self, **kwargs):
self.__dict__.update(**kwargs)
class Circle(Shape):
def __init__(self, **kwargs):
super(Circle, self).__init__(**kwargs)
Преимущество этого в том, что там меньше кода и не нужно поддерживать шаблонного как self.foo = kwargs['foo']
. Недостатком является то, что не очевидно, какие аргументы необходимы для Circle. Это считается чит или это хороший стиль (до тех пор, пока интерфейс для Circle хорошо документирован)?
Спасибо, всем, за ваши продуманные ответы. Для меня было полезно использовать взломанный код self.__dict__.update(**kwargs)
, экспериментируя с организацией моего кода, но я буду следить за тем, чтобы я заменил его правильной передачей аргументов и выполнил четкую проверку ошибок в производственном коде.
Я думаю, что это позволит вызывающему перегружать методы .... но если вы только человек, использующий этот код, и не заботитесь о злонамеренном поведении, это, вероятно, хорошо. –
@ JoranBeasley - Да, но если вы это сделали, вы по существу нарушаете правила, и это ваша собственная ошибка. –
Вам не хватает 'self'. –