Лично я не вижу ничего плохого в доступе к частному члену внутри класса. Фактически, это то, что я обычно делаю (если в составе свойства 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
является защита класса от недопустимых значений, установленных клиентским кодом. Нет никакого оправдания для установки внутреннего состояния на какое-то недопустимое значение в реализации самого класса.
Конечно, это не абсолютное правило. Конечно, времена, когда использование свойства для его логики внутри класса может быть разумным выбором в качестве защитной меры; действительно, я просто утверждаю, что не ошибается для доступа к закрытым членам внутри класса.
В вашем примере единственным отличием между методами 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