假设我有这样一个类:
class Alphabet(object):
__init__(self):
self.__dict = {'a': 1, 'b': 2, ... 'z': 26}
@property
def a(self):
return self.__dict['a']
@property
def b(self):
return self.__dict['b']
...
@property
def z(self)
return self.__dict['z']
这将是一项漫长而繁琐的任务,并且看起来非常多余。有没有办法动态创建这些属性?我知道您可以使用内置的setattr动态创建属性,但我想控制读/写/删除访问(因此我想使用属性)。谢谢!
答案 0 :(得分:31)
不要使用属性,而是实现以下方法:
__getattr__(self, name)
__setattr__(self, name, value)
__delattr__(self, name)
请参阅http://docs.python.org/reference/datamodel.html#customizing-attribute-access
您的__getattr__
方法可能如下所示:
def __getattr__(self, name):
try:
return self.__dict[name]
except KeyError:
msg = "'{0}' object has no attribute '{1}'"
raise AttributeError(msg.format(type(self).__name__, name))
答案 1 :(得分:0)
__dict
,并相信他们不要搞砸了。请记住,我们所有人都同意这里的成年人!
Ned Batchelder比我能解释得更好:
这个问题让我想起了我在Stack Overflow上或在 #python IRC频道:
- 如何查看变量是否存在?
- 如何使用变量作为另一个变量的名称?
- 如何将变量用作SQL表名的一部分?
所有这些共同点的是试图弥合两者之间的差距 两个域:程序中的数据,以及您的数据名称 程序。任何时候发生这种情况,都是您需要的明确迹象 在数据建模中提升一个级别。而不是26个列表,你需要 一本字典。而不是N个表,你应该有一个表 还有一栏。