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, если это возможно вообще.
Ответы
Ответ 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
свойство должно зависеть только от связанного объекта. Если вы хотите использовать некоторые внешние параметры, вы должны использовать методы.