创建可以为其分配属性的裸对象的最简单方法是什么?
具体的用例是:我在Django对象实例上进行各种操作,但有时实例是None(实例上有).在这种情况下,我想创建一个最简单的假对象,以便我可以为其属性赋值(例如.myobject.foo = 'bar').
基本上我正在寻找相当于这段Javascript的Python:
myobject = {}
myobject.foo = 'bar'
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用模拟对象/库,但我希望有一个非常简单的解决方案(就像上面的Javascript一样简单).有没有办法创建裸体对象实例?就像是:
myobject = object()
myobject.foo = 'bar'
Run Code Online (Sandbox Code Playgroud)
che*_*ner 32
您需要先创建一个简单的类:
class Foo(object):
pass
myobject = Foo()
myobject.foo = 'bar'
Run Code Online (Sandbox Code Playgroud)
你可以像这样做一个单行:
myobject = type("Foo", (object,), {})()
myobject.foo = 'bar'
Run Code Online (Sandbox Code Playgroud)
type函数调用与前一个class语句完全相同.
如果你想真的很小......
myobject = type("", (), {})()
Run Code Online (Sandbox Code Playgroud)
关键是内置类型(例如list和object)不支持用户定义的属性,因此您需要使用class语句或对3参数版本的调用来创建类型type.
ina*_*uma 10
如果您使用的是Python> = 3.3,则可以始终使用SimpleNamespace ; 它包含在Python types模块中.
SimpleNamespace非常棒,因为您还可以repr免费获得等效测试; 即使对于极简主义的物体,这两者都可能派上用场.
在OP的问题中翻译JavaScript看起来像:
from types import SimpleNamespace
myobject = SimpleNamespace() # myobject = {}
myobject.foo = 'bar'
Run Code Online (Sandbox Code Playgroud)
您还可以在实例化SimpleNamespace时使用关键字参数.这些参数将成为实例化的SimpleNamespace的属性:
p = SimpleNamespace(name='gary')
p.age = 32
p # => namespace(age=32, name='gary')
Run Code Online (Sandbox Code Playgroud)
因此,将字典转换为SimpleNamespace对象的快速简便方法 - 提供 字典键是正确的标识符 - 就像这样简单:
d = {
'name': 'gary',
'age': 33 # had a birthday.
}
p = SimpleNamespace(**d)
Run Code Online (Sandbox Code Playgroud)
Python> = 3.7有数据类,基本上是" 可变的名为元组 ".如果你有很多数据对象,这可能是你可能想要使用的东西.
小智 8
使用Bunch模块:
sudo pip install bunch
Run Code Online (Sandbox Code Playgroud)
一堆是允许通过dict.key语法访问其内容的字典.
然后那样:
from bunch import Bunch
b = Bunch()
b.foo = "Bar"
b["foo2"] = "Bar2"
print b
>> Bunch(foo='Bar', foo2='Bar2')
b["foo"] = "Baz"
print b
>> Bunch(foo='Baz', foo2='Bar2')
Run Code Online (Sandbox Code Playgroud)
我很晚才来到这里,但令我惊讶的是没有人提到namedtuples它可以完成这种事情:
Foo = namedtuple('Foo', ['x'])
f = Foo(x='myattribute')
f.x
Run Code Online (Sandbox Code Playgroud)
对于Python 3,
class Obj: pass
o = Obj()
o.name = 'gary'
o.age = 32
o
# <__main__.Obj at 0x17235ca65c0>
o.__dict__
# {'name': 'gary', 'age': 32}
Run Code Online (Sandbox Code Playgroud)