Использование одного и того же имени для атрибута и средства получения

#python #flask #getter-setter

#python #flask #средство получения-установки

Вопрос:

У меня есть следующий класс / модель:

 class Recipe(db.Model):
    ...
    user_id = db.Column(db.ForeignKey(("users.id")), nullable=False, index=True)
    author = db.relationship("User", uselist=False, back_populates="diets")
    ...

    # Permissions
    def can_view(self, user = None) -> bool:
        if user is None:
            user = current_user
        return self.author == user

  

Я могу использовать recipe.can_view() или recipe.can_view(some_user) , но я хочу иметь возможность вызывать recipe.can_view вместо recipe.can_view() , и я не знаю, какое хорошее решение для этого.

Спасибо

Комментарии:

1. Я боюсь, что у вас не может быть одного имени и ожидать, что Python прочитает ваши мысли. Если вы можете сделать recipe.can_view(user) , то can_view это вызываемый. Это не может быть одновременно bool. (создание вызываемого bool было бы возможно, но не идите этим путем)

2. Итак, мне нужно иметь отдельно именованный атрибут? О, позор. Но я вижу, как то, что я хочу, может вызвать некоторые проблемы. Спасибо!

3. Я бы выбрал can_view(user) и необязательно can_current_user_view

4. Имеет смысл, приятный и явный (только бит длиной). Спасибо!

Ответ №1:

Похоже, я не могу этого сделать (по крайней мере, не создавая беспорядка).

Итак, я выбрал решение, предложенное @zvone в комментариях:

Я бы пошел с can_view(user) и can_current_user_view

Итак, мой код:

     def can_view(self, user) -> bool:
        return self.is_author(user) or user.is_admin or self.is_public

    @property
    def can_current_user_view(self) -> bool:
        return self.can_view(user=current_user)