Метод Джанго Миксина, который влияет на составной класс

Лично я не вижу ничего плохого в доступе к частному члену внутри класса. Фактически, это то, что я обычно делаю (если в составе свойства getter / setter нет логики, которую я всегда хочу использовать).

Это имеет смысл для меня: код внутри класса составляет реализация этого класса; зачем скрывать реализацию от себя?

Вот пример того, что я имею в виду. Предположим, что у меня есть член, m_denominator, и я хочу, чтобы он никогда не был равен нулю:

private int m_denominator = 1;
public int Denominator
{
    get { return m_denominator; }
    set
    {
        if (value == 0)
            throw new ArgumentException("Denominator must not be zero.");
        m_denominator = value;
    }
}

Я мог бы сказать себе: «Хорошо, везде я устанавливаю это значение в этом классе, я должен использовать Denominator, чтобы убедиться, что я не устанавливаю его в ноль ». Но я полностью контролирую, что я устанавливаю Denominator - я внутри класса! В сценарии этого точкой логики в свойстве Denominator является защита класса от недопустимых значений, установленных клиентским кодом. Нет никакого оправдания для установки внутреннего состояния на какое-то недопустимое значение в реализации самого класса.

Конечно, это не абсолютное правило. Конечно, времена, когда использование свойства для его логики внутри класса может быть разумным выбором в качестве защитной меры; действительно, я просто утверждаю, что не ошибается для доступа к закрытым членам внутри класса.

1
задан s g 18 March 2019 в 23:03
поделиться

1 ответ

В вашем примере единственным отличием между методами common_logic является модель. Поэтому вы можете создать метод класса и использовать cls:

class NumberMixin(models.Model):
    number = models.IntegerField()

    @classmethod
    def common_logic(cls):
        obj = cls.objects.filter(name='fortytwo').first()
        obj.number = 42
0
ответ дан Alasdair 18 March 2019 в 23:03
поделиться
Другие вопросы по тегам:

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