Python类属性设置器

Python类属性设置器,python,Python,我想做的是: 从self.bar[xxx]读取时,我得到了实际值 当写入self.bar[xxx]时,调用setter进行真正的设置 下面是一个现实世界的例子: class Foo(object): bar = {'a': None, 'b': None} def do_something(self): print self.bar['a'] self.bar['a'] = 12 问题是,我不想检查self.\u vote_nums['up

我想做的是:

  • self.bar[xxx]
    读取时,我得到了实际值

  • 当写入
    self.bar[xxx]
    时,调用setter进行真正的设置

  • 下面是一个现实世界的例子:

    class Foo(object):
    
        bar = {'a': None, 'b': None}
    
        def do_something(self):
            print self.bar['a']
            self.bar['a'] = 12
    

    问题是,我不想检查
    self.\u vote_nums['up or down']
    在每次我想写它的时候都是空的。

    那么
    bar
    就不需要是
    dict
    。使用
    @property
    :等等,我刚刚意识到你想要密钥访问。。。嗯……或者编写一个
    set\u bar
    函数,将键和值传递给它。根据您的示例,这是不合逻辑的,一个真实世界的用例可能会有所帮助。@jozzas我已经用一个真实世界的示例Duplicate更新了:显然,因为它已经用回答者创建的
    @uberProperty
    回答了。
    class VoteMixin(object):
    
        self._vote_nums = {'up': None, 'down': None}
    
        def fetch_from_db(self):
            self._vote_nums = {} # set with values read from db
    
        @property
        def up_vote_nums(self):
            if self._vote_nums['up'] is None:
                self.fetch_from_db()
            return self._vote_nums['up']
    
        @property
        def down_vote_nums(self):
            # the same
            pass
    
        def up_vote(self):
            # update to db
    
            if self.vote_nums['up'] is None:
                self.fetch_from_db()
    
            self._vote_nums['up'] += 1
    
        def down_vote(self):
            # update to db
    
            if self.vote_nums['down'] is None:
                self.fetch_from_db()
    
            self._vote_nums['down'] += 1