@setter:在一个方法中传递和设置所有类属性

2024-09-29 20:20:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要一个可以从任何地方访问的单例类实例,该实例具有某些可以更改的会话变量

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')

我目前的财产法阻止了这一点。我确实希望将每个会话变量本身作为一个属性来维护,但我也希望将它们全部设置在一起,因为有很多会话变量。只是不喜欢把它当作字典传

如果有人能帮助设计和/或改进,我将不胜感激。我需要一个类的实例,它有一组可以从任何地方访问的变量。类中的变量可以更改,但类实例本身不能更改。我需要一个更好的方法是一次性设置所有变量(最好是一个方法,而不是设置字典)


Tags: 实例方法nameselfid字典modesession
1条回答
网友
1楼 · 发布于 2024-09-29 20:20:59

听起来您需要一组只读属性,但只需要一个“setter”

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

相关问题 更多 >

    热门问题