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

Mic*_*ael 17 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']
Run Code Online (Sandbox Code Playgroud)

这将是一项漫长而繁琐的任务,并且看起来非常多余.有没有办法动态创建这些属性?我知道您可以使用内置的setattr动态创建属性,但我想控制读/写/删除访问(因此我想使用属性).谢谢!

Thi*_*ter 33

不要使用属性,而是实现以下方法:

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

  • 我想,这会失去 IDE 提供自动完成属性的能力。 (2认同)