控制python类的getter和setter

tho*_*mas 5 python

考虑以下课程:

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))
Run Code Online (Sandbox Code Playgroud)

在我的代码中Token有一些其他函数(比如get_all()返回d_dict,has(s_name)告诉我我的令牌是否具有特定属性).

无论如何,我认为他们的计划存在缺陷,因为它不起作用:当我创建一个新实例时,python尝试调用__setattr__('d_dict', '{}').

我怎样才能实现类似的行为(可能以更加pythonic的方式?)而不必编写类似于Token.set(name,value)和get(name)的东西,我想要设置或获取令牌的属性.

关于设计缺陷和/或愚蠢的批评者欢迎:)

谢谢 !

Len*_*bro 3

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

当然,在上面的代码中,您所做的只是复制任何对象__dict__已经执行的操作,因此这是毫无意义的。如果您打算对某些属性进行特殊处理并实际使用这些属性的方法,我猜对了吗?

在这种情况下,您可以使用属性。

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
Run Code Online (Sandbox Code Playgroud)