创建可以为其分配属性的裸体对象的最简单方法是什么?
具体的用例是:我正在对Django对象实例进行各种操作,但有时实例是None(实例上有)。在这种情况下,我想创建一个最简单的假对象,以便我可以为其属性赋值(例如。myobject.foo = 'bar'
)。
基本上我正在寻找相当于这段Javascript的Python:
myobject = {}
myobject.foo = 'bar'
我知道我可以使用模拟对象/库,但我希望有一个非常简单的解决方案(就像上面的Javascript一样简单)。有没有办法创建裸体对象实例?类似的东西:
myobject = object()
myobject.foo = 'bar'
答案 0 :(得分:30)
您需要先创建一个简单的类:
class Foo(object):
pass
myobject = Foo()
myobject.foo = 'bar'
你可以像这样做一个单行:
myobject = type("Foo", (object,), {})()
myobject.foo = 'bar'
对type
的调用功能与之前的class
语句完全相同。
如果你想真的最小......
myobject = type("", (), {})()
关键是内置类型(例如list
和object
)不支持用户定义的属性,因此您需要使用{{1}创建类型}语句或调用class
的3参数版本。
答案 1 :(得分:8)
使用Bunch模块:
sudo pip install bunch
一堆字典允许通过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')
答案 2 :(得分:7)
如果您使用的是Python> = 3.3,则可以始终使用 SimpleNamespace ;它包含在Python types
模块中。
SimpleNamespace 非常棒,因为您还可免费获得repr
和等效测试;即使对于极简主义的物体,这两者都可能派上用场。
在OP的问题中翻译JavaScript看起来像:
from types import SimpleNamespace
myobject = SimpleNamespace() # myobject = {}
myobject.foo = 'bar'
您还可以在实例化 SimpleNamespace 时使用关键字参数。这些参数将成为实例化 SimpleNamespace :
的属性p = SimpleNamespace(name='gary')
p.age = 32
p # => namespace(age=32, name='gary')
因此,将字典转换为 SimpleNamespace 对象的快速简便方法 - 提供字典键是正确的标识符 - 就像这样简单:
d = {
'name': 'gary',
'age': 33 # had a birthday.
}
p = SimpleNamespace(**d)
Python> = 3.7有 dataclasses ,基本上是“ mutable named tuples ”。如果你有很多数据对象,这可能是你可能想要使用的东西。
答案 3 :(得分:3)
我很晚才到这里,但我很惊讶没有人提到namedtuples
,这完成了这件事:
WebDriverWait wait = new WebDriverWait(driver, timeout);
wait.until(ExpectedConditions.or(
ExpectedConditions.urlContains("http://first.si.te/url"),
ExpectedConditions.urlContains("http://second.si.te/url")
));
答案 4 :(得分:2)
class NakedObject(object):
pass
myobject = NakedObject()
myobject.foo = 'bar'
答案 5 :(得分:1)
您需要先将对象子类化为此...
class Myobject(object):
pass
myobject1 = Myobject()
myobject1.foo = 'bar'
答案 6 :(得分:1)
对于Python 3,
class Obj: pass
o = Obj()
o.name = 'gary'
o.age = 32
o
# <__main__.Obj at 0x17235ca65c0>
o.__dict__
# {'name': 'gary', 'age': 32}
答案 7 :(得分:0)
也许你正在寻找这样的东西:
myobject={}
myobject['foo']='bar'
然后它可以被称为:
print myobject['foo']
或者您可以使用类对象:
class holder(object):
pass
然后你可以使用这样的东西:
hold=holder()
hold.myobject='bar'
print hold.myobject
答案 8 :(得分:0)
根据@ PsychicOak的回答,您应该只使用dict。
但是,如果您真的想要一个可以操作的对象,请尝试:
class FooClass(object): pass
然后,您可以根据需要在FooClass
本身或实例上分配属性。
答案 9 :(得分:0)
我通常更喜欢为我的班级创建null object:
class User(Model):
username = CharField()
password = CharField()
NONE_USER = User(username='', password='')
然后我在使用裸体物体的地方使用它。
答案 10 :(得分:0)
函数在Python 3中可以具有属性。与裸类相比,您可以节省一整行代码。
naked = lambda: None
naked.foo = 'bar'