控制Python类的getter和setter

6 投票
6 回答
7919 浏览
提问于 2025-04-15 13:26

考虑一下下面这个类:

class Token:
    def __init__(self):
        self.d_dict = {}

    def __setattr__(self, s_name, value):
        self.d_dict[s_name] = value

    def __getattr__(self, s_name):
        if s_name in self.d_dict.keys():
            return self.d_dict[s_name]
        else:
            raise AttributeError('No attribute {0} found !'.format(s_name))

在我的代码中,Token类有一些其他的功能,比如get_all()可以返回d_dict,还有has(s_name)可以告诉我这个token是否有某个特定的属性。

不过,我觉得我的计划有点问题,因为它没有正常工作:当我创建一个新的实例时,python试图调用__setattr__('d_dict', '{}')

我该如何实现类似的功能(也许用更符合python风格的方式?),而不需要每次设置或获取token的属性时都写像Token.set(name, value)和get(name)这样的代码。

欢迎对设计缺陷和/或愚蠢之处提出批评 :)

谢谢!

6 个回答

2

这是一个解决方案,虽然不是很符合Python的风格,但可以用。正如Lennart Regebro所指出的,你需要对d_dict使用一个特殊的情况。

class Token(object):

    def __init__(self):
        super(Token,self).__setattr__('d_dict', {})

    def __getattr__(self,name):
        return self.a[name]

    def __setattr__(self,name,value):
        self.a[name] = value

你需要使用新式类。

3

__dict__的特殊处理是这样的:

def __init__(self):
    self.__dict__['d_dict'] = {}

其实不需要使用新式类来实现这个功能。

3

你需要对 d_dict 进行特殊处理。

不过,实际上在上面的代码中,你只是重复了任何对象在使用 __dict__ 时已经做的事情,所以这样做其实没什么意义。我猜对了吧,你是想对某些属性进行特殊处理,并且想为这些属性使用方法?

如果是这样的话,你可以使用属性(properties)。

class C(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x

撰写回答