可以动态地向对象添加属性吗?

时间:2013-08-14 14:39:23

标签: python python-3.x

我想创建一个对象,然后动态地向对象添加属性。这是一些伪代码EX1:

a = object()
a.attr1 = 123
a.attr2 = '123'
a.attr3 = [1,2,3]

EX2:the first page of this PDF

在Python中,可以动态地向对象添加属性(类似于我给出的两个示例)?如果是,怎么样?

6 个答案:

答案 0 :(得分:6)

如果您使用的是Python 3.3+,请使用types.SimpleNamespace

>>> import types
>>> a = types.SimpleNamespace()
>>> a.attr1 = 123
>>> a.attr2 = '123'
>>> a.attr3 = [1,2,3]
>>> a.attr1
123
>>> a.attr2
'123'
>>> a.attr3
[1, 2, 3]

答案 1 :(得分:3)

  

在Python中,可以动态地向对象添加属性   (类似于我给出的两个例子)?

  

如果是,怎么样?

你可以这样做:

class AttrHolder:
    pass

a = AttrHolder()

a.attr1 = 123
a.attr2 = '123'
a.attr3 = [1,2,3]

甚至可能真的很糟糕:

import email #my choice of module is arbitrary

email.random_attribute = 'hello'

未提出的问题:你应该这样做吗?可能不是。您只是将这些东西用作适当dict的替身。如果您想要命名属性,请考虑namedtuple

A = namedtuple('Attribute_Holder',['attr1','attr2','attr3'])
a = A(123,'123',[1,2,3])

这为A提供了(宽松的)合约,并提供了一个不错的repr

In [70]: print(a)
Attribute_Holder(attr1=123, attr2='123', attr3=[1, 2, 3])

或者只使用dict。这就是他们的目的。

事实上,这就是你在“动态添加属性”时所做的事情,只需要一个不必要的抽象层。考虑一下,使用上面的AttrHolder

In [77]: a = AttrHolder()

In [78]: a.__dict__
Out[78]: {}

In [79]: a.hi = 'hello'

In [80]: a.__dict__
Out[80]: {'hi': 'hello'}

您是否喜欢使用dict

答案 2 :(得分:2)

以下是一个例子:

class Test:
    pass
for mark, name in enumerate(("attr1", "attr2", "attr3")):
    setattr(Test, name, mark)
print Test.attr1
print Test.attr2
print Test.attr3

输出:

0
1
2

所以,答案是肯定的。虽然它可能不是一个好主意(可能导致诸如失去属性或某些东西的问题)。

答案 3 :(得分:0)

嗯,我错过了什么吗?请看以下示例:

class C():
   def __init__(self, x):
       self.myX = x

c = C(42)
c.attr1 = 123
print c.myX
print c.attr1

什么似乎是问题?

答案 4 :(得分:0)

我将字典用于您描述的确切目的(至少从我对该问题的理解)......

dict = {}
dict["attr1"] = 123
dict["attr2"] = '123'
dict["attr3"] = [1,2,3]

dict.get("attr1")

答案 5 :(得分:0)

如果您真的想要为匿名类匿名实例添加属性,可以写一下:

>>> obj = type('obj', (), {})()
>>> obj.attr1 = 123
>>> obj.attr2 = '123'
>>> obj.attr3 = [1,2,3]

但是,真的,不要这样做!

相关问题