![](/img/trans.png)
[英]how do I create a dict with all fields and properties of a python object?
[英]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.