说我有以下简单的Class对象
class TEST:
def __init__(self, project = 'ABC', scenarios = {'A': [1,2,3], 'B': [4,5,6]}):
self.project = project
self.scenarios = scenarios
P = TEST(project = 'ABC', scenarios = {'A': [1,2,3], 'B': [4,5,6]})
print(P.scenarios)
{'A': [1, 2, 3], 'B': [4, 5, 6]}
我想要的东西:使用上面的示例,我希望能够指定:
P = TEST(project = 'ABC', scenarios = {'A': [1,2,3], 'B': [4,5,6], 'C': [7,8,9]})
并能够返回以下输出
In [2]:P.A
Out[2]: [1, 2, 3]
In [3]:P.B
Out[4]: [4, 5, 6]
In [3]:P.C
Out[4]: [7, 8, 9]
也就是说,我想自动将字典键添加为属性,并让它们返回字典的值。
我尝试过的事情:这类似于Pandas DataFrame自动将列名称添加为属性并返回系列的方式。我试过梳理那里的后端代码,但是没有运气。
lubridate很有帮助,但是我无法获得任何帮助,因为我无法找到一种将其添加为属性的方法(例如self。+ censs.keys(),等等
答案 0 :(得分:1)
您可以使用__dict__
更新实例的scenarios
:
class TEST:
def __init__(self, project='ABC', scenarios=None):
self.project = project
self.scenarios = scenarios or {'A': [1, 2, 3], 'B': [4, 5, 6]}
self.__dict__.update(self.scenarios)
>>> P = TEST(project='ABC', scenarios={'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
>>> P.A
[1, 2, 3]
>>> P.B
[4, 5, 6]
>>> P.C
[7, 8, 9]
顺便说一句,除非您确定自己在做什么,否则这可能不是您的真实代码,而是avoid mutable default arguments。
答案 1 :(得分:1)
首先,看看setattr()
函数的这种微小用法,该函数用于定义模块,类等的属性。
>>> class A:
... pass
...
>>> a = A()
>>> setattr(a, "prop1", 10)
>>>
>>> a.prop1
10
>>>
>>> setattr(a, "increment", lambda x: x + 1)
>>>
>>> a.increment(110)
111
>>>
最后,您可以尝试这样。
a 就像自己
prop1 类似于功能,即
A
,B
,C
场景类似于 10 ,即
[1, 2, 3]
,[4, 5, 6]
,[7, 8, 9]
>>> class TEST:
... def __init__(self, project = 'ABC', scenarios = {'A': [1,2,3], 'B': [4,5,6]}):
... self.project = project
... for feature in scenarios:
... scenario = scenarios[feature]
... setattr(self, feature, scenario)
...
>>>
>>> P = TEST(project = 'ABC', scenarios = {'A': [1,2,3], 'B': [4,5,6], 'C': [7,8,9]})
>>>
>>> P.A
[1, 2, 3]
>>>
>>> P.B
[4, 5, 6]
>>>
>>> P.C
[7, 8, 9]
>>>
您可以使用help(setattr)
在Python交互式终端上获得迷你帮助,如下所示。
有关模块内置模块中内置函数setattr的帮助:
setattr(obj,名称,值,/) 将给定对象上的命名属性设置为指定值。
setattr(x,'y',v)等效于``x.y = v''