我想在Python中创建一个动态对象(在另一个对象内),然后为其添加属性.
我试过了:
obj = someobject
obj.a = object()
setattr(obj.a, 'somefield', 'somevalue')
Run Code Online (Sandbox Code Playgroud)
但这没用.
有任何想法吗?
编辑:
我从for循环中设置属性,循环遍历值列表,例如
params = ['attr1', 'attr2', 'attr3']
obj = someobject
obj.a = object()
for p in params:
obj.a.p # where p comes from for loop variable
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我会得到obj.a.attr1,obj.a.attr2,obj.a.attr3.
我使用了这个setattr函数因为我不知道怎么做obj.a.NAME一个for循环.
如何根据p上面示例中的值设置属性?
所以,我在回答这个问题时正在玩Python ,我发现这是无效的:
o = object()
o.attr = 'hello'
Run Code Online (Sandbox Code Playgroud)
由于AttributeError: 'object' object has no attribute 'attr'.但是,对于从object继承的任何类,它是有效的:
class Sub(object):
pass
s = Sub()
s.attr = 'hello'
Run Code Online (Sandbox Code Playgroud)
打印s.attr按预期显示"你好".为什么会这样?Python语言规范中的内容指定您不能将属性分配给vanilla对象?
我有这个代码:
>>> class G:
... def __init__(self):
... self.x = 20
...
>>> gg = G()
>>> gg.x
20
>>> gg.y = 2000
Run Code Online (Sandbox Code Playgroud)
这段代码:
>>> from datetime import datetime
>>> my_obj = datetime.now()
>>> my_obj.interesting = 1
*** AttributeError: 'datetime.datetime' object has no attribute 'interesting'
Run Code Online (Sandbox Code Playgroud)
根据我的Python知识,我会说datetime覆盖setattr/ getattr,但我不确定.你能在这里说清楚吗?
编辑:我不是特别感兴趣datetime.我总是想知道对象.
在python中,为这样的对象实例创建新属性是非法的
>>> a = object()
>>> a.hhh = 1
Run Code Online (Sandbox Code Playgroud)
投
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'hhh'
Run Code Online (Sandbox Code Playgroud)
但是,对于一个函数对象,它是可以的.
>>> def f():
... return 1
...
>>> f.hhh = 1
Run Code Online (Sandbox Code Playgroud)
这种差异背后的理由是什么?
这有效:
class MyClass(object):
pass
someinstance = MyClass()
someinstance.myattribute = 42
print someinstance.myattribute
>>> 42
Run Code Online (Sandbox Code Playgroud)
但这不是:
someinstance = object()
someinstance.myattribute = 42
>>> AttributeError: 'object' object has no attribute 'myattribute'
Run Code Online (Sandbox Code Playgroud)
为什么?我有一种感觉,这与对象是一个内置类有关,但我发现这不令人满意,因为我在MyClass的声明中没有改变.
以下代码不会抛出AttributeError
class MyClass():
def __init__(self):
self.a = 'A'
self.b = 'B'
my_obj = MyClass()
my_obj.c = 'C'
Run Code Online (Sandbox Code Playgroud)
这与之形成鲜明对比
>>> {}.a = 'A'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'a'
Run Code Online (Sandbox Code Playgroud)
有什么区别?它是关于dict是一个内置类,而MyClass是用户定义的吗?
我才意识到:
class A(object): pass
a = A()
a.x = 'whatever'
Run Code Online (Sandbox Code Playgroud)
Works(不会引发错误并创建新x成员).
但是这个:
a = object()
a.x = 'whatever'
Run Code Online (Sandbox Code Playgroud)
举:
AttributeError: 'object' object has no attribute 'x'
Run Code Online (Sandbox Code Playgroud)
虽然我可能永远不会在实际生产代码中使用它,但我对于不同行为的原因有点好奇.
任何提示?