考虑以下课程:
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)的东西,我想要设置或获取令牌的属性.
关于设计缺陷和/或愚蠢的批评者欢迎:)
谢谢 !
您需要对 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)