Стиль self.__dict__.update(**kwargs) хороший или плохой?

Допустим, в Python у меня есть некоторый класс Circle, который наследуется от Shape. Shape нужны координаты x и y, и, кроме того, Circle нужен радиус. Я хочу иметь возможность инициализировать Circle, выполнив что-то вроде

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)был полезен для меня в экспериментах с организацией моего кода, но я позабочусь о том, чтобы заменить его на правильную явную передачу аргументов и четкую проверку ошибок. в производственном коде.

41
задан Simeon Visser 11 December 2013 в 11:27
поделиться