@setter: передать и установить все свойства класса одним методом - PullRequest
0 голосов
/ 03 августа 2020

Мне нужен экземпляр класса Singleton, доступный из любого места и имеющий определенные переменные сеанса, которые могут изменяться.

class MySingletonClass(Singleton):

    @property
    def session(self):
        return self

    @session.setter
    def session(self, d):
        self.name = d['name']
        self.id = d['id']
        self.mode = d['mode']

experiment = MySingletonClass()

Затем он может быть импортирован и переменные установлены как таковые

from core import experiment
experiment.session={'name':'my_exp_name', 'mode':'my_mode', 'id':"1234"}

Я хочу передать их все в одном, но вместо словаря, который у меня есть сейчас, в качестве аргумента функции. Итак, что-то вроде следующего:

experiment.set_session('my_exp_name', 'my_mode','1234')

Мой текущий подход к свойствам препятствует этому. Я действительно хочу сохранить каждую переменную сеанса как свойство само по себе, но я также хочу установить их все вместе, поскольку существует множество переменных сеанса. Просто не люблю передавать это как словарь.

Я был бы признателен, если бы кто-нибудь мог помочь с дизайном и / или улучшить его. Мне нужен экземпляр класса с множеством переменных, к которым можно получить доступ откуда угодно. Переменные внутри класса могут изменяться, но не сам экземпляр класса. И мне нужно было лучше установить все переменные в один go (желательно метод вместо установки словаря)

1 Ответ

0 голосов
/ 04 августа 2020

Похоже, вам нужен набор свойств только для чтения, но с одним «установщиком».

class MySingletonClass(Singleton):
    @property
    def session(self):
        return self

    @property
    def name(self):
        return self._name

    @property
    def mode(self):
        return self._mode

    @property
    def id(self):
        return self._id

    def set_session(self, name, mode, id):
        self._name = name
        self._mode = mode
        self._id = id

Вы можете уменьшить часть шаблона с помощью специального дескриптора:

class Field:
    def __get__(self, obj, type):
        if obj is None:
            return self
        return getattr(obj, self.name)

    def __set_name__(self, obj, name):
        self.name = "_" + name


class MySingletonClass(Singleton):
    name = Field()
    mode = Field()
    id = Field()

    def set_session(self, name, mode, id):
        self._name = name
        self._mode = mode
        self._id = id
...