В Python вы можете назначить произвольный атрибут вне определяющего класса :
class Profile(models.Model):
user = models.OneToOneField(User)
name = models.CharField(max_length=140)
p = Profile()
p.age = 42
Основным механизмом здесь является атрибут __dict__
, который содержит словарь всех атрибутов.
Нам всем сказали не раскрывать нашу внутреннюю работу клиентскому коду , но присоединение новых данных не имеет ничего общего с инкапсуляцией, верно? Является ли эта идиома общей для кода Python?
Что я имею в виду ...
Каждое Tweet
имеет стандартные поля, такие как id
, text
, owner
.
Возвращая список твитов для пользователя, вы хотите отобразить, является ли твит «избранным» этим пользователем.
Очевидно, что для получения is_favorite
вам нужно запросить отношение «многие ко многим» для этого user
.
Хорошо ли было бы предварительно заполнить Tweet
объекты is_favorite
, соответствующими текущему пользователю ?
Конечно, я могу представить метод is_favorite_for(user)
, но я бью Язык шаблонов Django Ограничения, которые не позволяют вызывать методы с аргументами изнутри шаблона. Кроме того, я считаю, шаблон не должен вызывать методы вообще .
Я знаю, что это будет работать нормально, но мне интересно, если бы подобное в проекте с открытым исходным кодом заставило бы других разработчиков смотреть на меня с презрением.
Sidenote:
Я пришел из C # / .NET, где динамические типы были введены совсем недавно и не получили широкого применения, за исключением некоторых нишевых областей (совместимость, платформы IoC, клиентские платформы REST и т. Д.).