Проблема с использованием аргументов по умолчанию заключается в том, что фактически существует только один их экземпляр. Когда вы говорите attrs={}
в определении метода init , этот единственный экземпляр по умолчанию {} является значением по умолчанию для каждого вызова этого метода (он не делает новый по умолчанию пустой dict каждый раз, он использует то же самое).
Проблема в том, что если существует только один attrs
, а затем для каждого экземпляра Thing, который вы говорите self.attrs = attrs
, переменная-член self.attrs
для каждого отдельного экземпляра указывает на один общий экземпляр по умолчанию. attrs
.
Другой вопрос, не является ли это полностью избыточным? Вы можете использовать **kwargs
для передачи ключевых слов / значений, аргументов или словаря. Если вы только что определили это:
class Thing:
def __init__(self, **kwargs):
for arg in kwargs:
self.attrs[arg] = kwargs[arg]
Все эти стратегии все еще работают:
thing1 = Thing(color='red')
thing2 = Thing(**{'color':'red'})
my_dict = {'color' : 'red'}
thing3 = Thing(**my_dict)
Так что, если вы просто определите и используете Thing таким образом, вы полностью избежите своей проблемы.