我想创建一个对象,然后动态地向对象添加属性。这是一些伪代码EX1:
a = object()
a.attr1 = 123
a.attr2 = '123'
a.attr3 = [1,2,3]
EX2:the first page of this PDF
在Python中,可以动态地向对象添加属性(类似于我给出的两个示例)?如果是,怎么样?
答案 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]
但是,真的,不要这样做!