Python 类对象:基于输入列表向类添加属性

Python 类对象:基于输入列表向类添加属性,python,python-3.x,class,Python,Python 3.x,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]}) pri

假设我有以下简单的类对象

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]
也就是说,我想自动添加字典键作为属性,并让它们返回字典的值

我尝试过的内容:这类似于熊猫数据框自动将列名添加为属性并返回序列的方式。我尝试过梳理后端代码,但没有成功


是有帮助的,但我无法使用它,因为我无法找到将其添加为属性的方法(例如self.+scenarios.keys(),等等)

您只需使用
scenarios
更新实例的
\u dict\u

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]

顺便说一句,这可能不是你真正的代码,但除非你确定你在做什么。

首先,看看
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就像self

prop1类似于功能,即
A
B
C

场景类似于10,即
[1,2,3]
[4,5,6]
[7,8,9]

您可以使用下面显示的
help(setattr)
在Python交互式终端上获得迷你帮助

关于内置模块内置函数setattr的帮助:

setattr(对象,名称,值,/) 将给定对象上的命名属性设置为指定值

setattr(x,'y',v)等同于``x.y=v''


警告:您正在为
方案使用可变默认值。
>>> 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]
>>>