控制Python类的getter和setter
考虑一下下面这个类:
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