类对象:根据输入列表向类添加属性

时间:2019-09-23 16:13:44

标签: python python-3.x class

说我有以下简单的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(),等等

2 个答案:

答案 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 类似于功能,即ABC

     

场景类似于 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''