Несколько аргументов в @property.setter, возможно ли?
Доброго здоровья, уважаемые эксперты!
Собственно, вопрос в заголовке. Имею некий код:
class A:
def __init__(self):
self.__x = None
self.__y = None
@property
def xy(self):
return self.__x, self.__y
@xy.setter
def xy(self, val_x, val_y):
self.__x = val_x
self.__y = val_y
так вот, если использовать @property, то не получается принять и обработать второй аргумент в сеттере. Можно, конечно, передать в виде кортежа, списка или словаря, а потом распаковать, но всё это не то. Все примеры, которые удалось найти были только с одним аргументом. Или @property.setter не поддерживает такой возможности и лучше использовать обычные методы?
Ответы (1 шт):
Додумался до такого варианта с применением функции property():
class A:
def __init__(self):
self.__x = 12
self.__y = 42
def get_var(self):
return f'X: {self.__x}, Y: {self.__y}'
def set_var(self, val, val2=None):
if val2 is not None:
self.__y = val2
self.__x = val
var = property(get_var, set_var)
a = A()
print(a.var) # X: 12, Y: 42
a.var = 678
print(a.var) # X: 678, Y: 42
a.set_var(3, 77)
print(a.var) # X: 3, Y: 77
т.е., если аргумент сеттера классически один, то работаем как с атрибутом a.var = 678. Если аргументов несколько, то можно явно вызвать метод сеттера (при этом он не должен быть приватным!), указанный в property(), как обычный метод и передать второй аргумент, который может быть корректно обработан.