我想在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 shell编写)
>>> o = object()
>>> o.test = 1
Traceback (most recent call last):
File "<pyshell#45>", line 1, in <module>
o.test = 1
AttributeError: 'object' object has no attribute 'test'
>>> class test1:
pass
>>> t = test1()
>>> t.test
Traceback (most recent call last):
File "<pyshell#50>", line 1, in <module>
t.test
AttributeError: test1 instance has no attribute 'test'
>>> t.test = 1
>>> t.test
1
>>> class test2(object):
pass
>>> t = test2()
>>> t.test = 1
>>> …Run Code Online (Sandbox Code Playgroud) 在Javascript中它将是:
var newObject = { 'propertyName' : 'propertyValue' };
Run Code Online (Sandbox Code Playgroud)
怎么用Python做?
我正在尝试创建一个子类namedtuple并提供不同的初始化器,以便我可以以不同的方式构造对象.例如:
>>> from collections import namedtuple
>>> class C(namedtuple("C", "x, y")) :
... __slots__ = ()
... def __init__(self, obj) : # Initialize a C instance by copying values from obj
... self.x = obj.a
... self.y = obj.b
... def __init__(self, x, y) : # Initialize a C instance from the parameters
... self.x = x
... self.y = y
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用:
>>> c = C(1, 2)
Traceback (most recent call last):
File …Run Code Online (Sandbox Code Playgroud) 在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)
这种差异背后的理由是什么?
例如,这段代码是Python:
a = object()
a.b = 3
Run Code Online (Sandbox Code Playgroud)
投 AttributeError: 'object' object has no attribute 'b'
但是,这段代码:
class c(object): pass
a = c()
a.b = 3
Run Code Online (Sandbox Code Playgroud)
很好.当类x没有该属性时,为什么我可以分配属性b?如何让我的类只定义属性?
这有效:
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的声明中没有改变.
在Python中,__dict__实例似乎对某些类是"开放的",对其他类"封闭":
# "closed" type example:
x = object()
x.eggs = 'spam' # raises an AttributeError
Run Code Online (Sandbox Code Playgroud)
然而:
# "open" type example I:
x = Exception()
x.eggs = 'spam' # does not raise an AttributeError
# "open" type example II: subclasses
class thing(object): pass
x = thing()
x.eggs = 'spam' # does not raise an AttributeError
Run Code Online (Sandbox Code Playgroud)
我想了解这种行为差异的实施地点/方式/原因:为什么object关闭但是thing开放?为什么Exception开放?这个问题有两个原因:
在纯Python中,我发现复制"封闭"行为的唯一方法是实现__setattr__自己并AttributeError在其中引发,手动编写适当格式的错误消息.是否有一种不那么冗长,更干的方式(以及一种不会产生潜在误导性回溯的方式__setattr__)?
在我编写的IPC模块中,我想记录一个使用示例,最简洁和最通用的方法是找到一个内置的例子type(失败,一个来自标准库)(a)可以腌制并发送到另一个进程,(b)其实例表现出"开放"行为.到目前为止,我发现的最好的是Exception但在文档中看起来有点误导(人们会认为它是关于异常的).更通用的对象会更好,但是object关闭,除非将其定义保存在路径上的文件中,否则子类(thing如上例中所示)是不可能pickle …
我为什么需要
class DummyObject(object):
pass
Run Code Online (Sandbox Code Playgroud)
为了要做
dummy = DummyObject()
dummy.foo = 42
Run Code Online (Sandbox Code Playgroud)
为什么这在Python中不合法?
dummy = object()
dummy.foo = 42
Run Code Online (Sandbox Code Playgroud)
这给出了错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'foo'
Run Code Online (Sandbox Code Playgroud) 我才意识到:
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)
虽然我可能永远不会在实际生产代码中使用它,但我对于不同行为的原因有点好奇.
任何提示?
我不明白为什么在 Python 3 中我不能向ElementTree.Element实例添加一些属性。这是区别:
在 Python 2 中:
Python 2.6.6 (r266:84292, Jun 18 2012, 14:18:47)
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from xml.etree import ElementTree as ET
>>> el = ET.Element('table')
>>> el.foo = 50
>>> el.foo
50
>>>
Run Code Online (Sandbox Code Playgroud)
在 Python 3 中:
Python 3.3.0 (default, Sep 11 2013, 16:29:08)
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux
Type "help", "copyright", "credits" or "license" for more …Run Code Online (Sandbox Code Playgroud) 我无法使用点(.)访问字典键,但是当我定义一个继承自 dict 的类时,我可以使用点(.)访问它的键。有人能解释一下吗?
所以,当我运行这段代码时:
d = {'first_key':1, 'second_key':2}
d.first_key
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
'dict' object has no attribute 'first_key'
Run Code Online (Sandbox Code Playgroud)
但是当我运行这个时:
class DotDict(dict):
pass
d = DotDict()
d.first_key = 1
d.second_key = 2
print(d.first_key)
print(d.second_key)
Run Code Online (Sandbox Code Playgroud)
我明白了:
1
2
Run Code Online (Sandbox Code Playgroud) 为了支持任意属性赋值,对象需要
__dict__:与对象关联的字典,其中可以存储任意属性.否则,无处可放新属性.一个实例
object没有携带__dict__- 如果确实如此,在可怕的循环依赖问题之前(因为__dict__,像大多数其他所有东西一样,继承自object;-),这会使Python中的每个对象都带有一个dict,这意味着开销当前没有或不需要dict的每个对象的许多字节(实质上,所有没有任意可分配属性的对象都没有或不需要dict)....
当类具有
__slots__特殊属性(字符串序列),那么class语句(更准确地说,默认元类type)并没有装备有该类的每个实例__dict__(有任意属性,因此的能力),只是一个有限,具有给定名称的刚性"槽"集(基本上每个可以对一些对象保持一个引用的位置).
如果一个对象没有__dict__,它的类必须有一个__slots__属性吗?
例如,object没有的实例__dict__,
>>> object().__dict__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute '__dict__'
Run Code Online (Sandbox Code Playgroud)
但
>>> object.__slots__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'object' has no attribute '__slots__'
Run Code Online (Sandbox Code Playgroud)
那么,为什么一个实例 …
python ×13
attributes ×3
class ×3
object ×3
python-3.x ×2
elementtree ×1
function ×1
instances ×1
namedtuple ×1
properties ×1
self ×1