如何在Python中动态创建属性?

时间:2012-06-10 09:13:03

标签: python

假设我有这样一个类:

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动态创建属性,但我想控制读/写/删除访问(因此我想使用属性)。谢谢!

2 个答案:

答案 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比我能解释得更好:


Keep data out of your variable names

  

这个问题让我想起了我在Stack Overflow上或在   #python IRC频道:

     
      
  • 如何查看变量是否存在?
  •   
  • 如何使用变量作为另一个变量的名称?
  •   
  • 如何将变量用作SQL表名的一部分?
  •   
     

所有这些共同点的是试图弥合两者之间的差距   两个域:程序中的数据,以及您的数据名称   程序。任何时候发生这种情况,都是您需要的明确迹象   在数据建模中提升一个级别。而不是26个列表,你需要   一本字典。而不是N个表,你应该有一个表   还有一栏。