Python简单的裸体对象

时间:2012-05-30 20:17:10

标签: python oop

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

具体的用例是:我正在对Django对象实例进行各种操作,但有时实例是None(实例上有)。在这种情况下,我想创建一个最简单的假对象,以便我可以为其属性赋值(例如。myobject.foo = 'bar')。

基本上我正在寻找相当于这段Javascript的Python:

myobject = {}
myobject.foo = 'bar'

我知道我可以使用模拟对象/库,但我希望有一个非常简单的解决方案(就像上面的Javascript一样简单)。有没有办法创建裸体对象实例?类似的东西:

myobject = object()
myobject.foo = 'bar'

11 个答案:

答案 0 :(得分:30)

您需要先创建一个简单的类:

class Foo(object):
    pass

myobject = Foo()
myobject.foo = 'bar'

你可以像这样做一个单行:

myobject = type("Foo", (object,), {})()
myobject.foo = 'bar'

type的调用功能与之前的class语句完全相同。

如果你想真的最小......

myobject = type("", (), {})()

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