Несколько аргументов в @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 шт):

Автор решения: Evgeniy Porovozoff

Додумался до такого варианта с применением функции 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(), как обычный метод и передать второй аргумент, который может быть корректно обработан.

→ Ссылка