Python简单的裸体对象

Par*_*and 27 python oop

创建可以为其分配属性的裸对象的最简单方法是什么?

具体的用例是:我在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)

关键是内置类型(例如listobject)不支持用户定义的属性,因此您需要使用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)


mli*_*ner 5

我很晚才来到这里,但令我惊讶的是没有人提到namedtuples它可以完成这种事情:

Foo = namedtuple('Foo', ['x'])
f = Foo(x='myattribute')
f.x
Run Code Online (Sandbox Code Playgroud)

  • 要使用namedtuple,我们应该提前知道属性,但这里可能不是这样。在这种情况下,您不能向对象添加任意属性。 (3认同)

Bri*_*rns 5

对于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)