Методы Python: значения параметров по умолчанию оценены ОДНАЖДЫ

Попробуйте это, может быть полезным... http://www.ubuntuupdates.org/package/core/precise/universe/base/ekiga-dbg

7
задан YvesLeBorg 14 August 2015 в 00:30
поделиться

3 ответа

props не должно иметь такого значения по умолчанию. Вместо этого сделайте следующее:

class a(object):
    def __init__(self, props=None):
        if props is None:
            props = {}
        self.props = props

Это обычный питон "gotcha" .

11
ответ дан 6 December 2019 в 09:20
поделиться

Ваша проблема заключается в этой строке:

def __init__(self, props={}):

{} - изменяемый тип. А в Python значения аргументов по умолчанию оцениваются только один раз. Это означает, что все ваши экземпляры используют один и тот же объект словаря!

Чтобы исправить это, измените его на:

class a(object):
    def __init__(self, props=None):
        if is None:
            props = {}
        self.props = props
7
ответ дан 6 December 2019 в 09:20
поделиться

Краткая версия: Сделайте это:

class a(object):
    def __init__(self, props=None):
        self.props = props if props is not None else {}

class b(a):
    def __init__(self, val = None):
        super(b, self).__init__()
        self.props.update({'arg': val})

class c(b):
    def __init__(self, val):
    super(c, self).__init__(val)

Длинная версия:

Определение функции оценивается ровно один раз, поэтому каждый раз, когда вы вызываете ее, используется один и тот же аргумент по умолчанию. Чтобы это работало так, как вы ожидали, аргументы по умолчанию должны оцениваться каждый раз при вызове функции. Но вместо этого Python генерирует объект функции один раз и добавляет ему значения по умолчанию (как func_obj.func_defaults )

2
ответ дан 6 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

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