簡體   English   中英

如何在Python中動態創建屬性?

[英]How do I dynamically create properties in 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動態創建屬性,但我想控制讀/寫/刪除訪問(因此我想使用屬性)。 謝謝!

不要使用屬性,而是實現以下方法:

  • __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))

不要那樣做。 只要直接讓__dict上的類消費者信任他們就不要搞砸了。 記住,我們都在這里同意成年人!

Ned Batchelder解釋得比我能做得更好:


保留變量名稱之外的數據

這個問題讓我想起了我在Stack Overflow或#python IRC頻道上看過的其他人:

  • 如何查看變量是否存在?
  • 如何使用變量作為另一個變量的名稱?
  • 如何將變量用作SQL表名的一部分?

所有這些共同點的是試圖彌合兩個域之間的差距:程序中的數據和程序中的數據名稱。 任何時候發生這種情況,都清楚地表明您需要在數據建模中提升一個級別。 而不是26個列表,您需要一個字典。 而不是N個表,你應該有一個表,其中還有一個列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM