Подтвердить что ты не робот

Python: как передать более одного аргумента в свойство getter?

Рассмотрим следующий пример:

class A:
    @property
    def x(self): return 5

Итак, конечно, вызов a = A(); a.x вернет 5

Но представьте, что вы хотите изменить свойство x.
Таким образом, например:

class A:
    @property
    def x(self, neg = False): return 5 if not neg else -5

И назовите его a = A(); a.x(neg=True)

Это вызовет TypeError: 'int' object is not callable, что вполне нормально, так как наш x оценивается как 5.

Итак, я хотел бы знать, как передать более одного аргумента в свойство getter, если это возможно вообще.

4b9b3361

Ответ 1

Обратите внимание, что вам не нужно использовать property в качестве декоратора. Вы можете довольно счастливо использовать его по-старому и разоблачить отдельные методы в дополнение к свойству:

class A:
    def get_x(self, neg=False):
        return -5 if neg else 5
    x = property(get_x)

>>> a = A()
>>> a.x
5
>>> a.get_x()
5
>>> a.get_x(True)
-5

Это может быть или не быть хорошей идеей в зависимости от того, что вы делаете с ней (но я бы ожидал увидеть отличное оправдание в комментарии, если бы я наткнулся на этот шаблон в любом коде, который я просматривал)

Ответ 2

Я думаю, вы не полностью понимали цель свойств.

Если вы создадите свойство x, вы получите доступ к нему, используя obj.x вместо obj.x(). После создания свойства невозможно сразу вызвать базовую функцию.

Если вы хотите передать аргументы, назовите свой метод get_x и не сделайте это свойство:

def get_x(self, neg=False):
    return 5 if not neg else -5

Если вы хотите создать сеттер, сделайте следующее:

class A:
    @property
    def x(self): return 5

    @x.setter
    def x(self, value): self._x = value

Ответ 3

В вашем втором примере вы используете a.x(), как если бы это была функция: a.x(neg=True). Имея это в виду, почему бы просто не определить его как функцию?

Ответ 4

свойство должно зависеть только от связанного объекта. Если вы хотите использовать некоторые внешние параметры, вы должны использовать методы.