如何创建带有指定字段的“空”对象

0 投票
3 回答
779 浏览
提问于 2025-04-18 05:58

为了测试,我需要创建一个类似于空对象的东西,并且里面有一些特定的字段。让我通过一个例子来说明:

目前有一个结构:

var = {
    'blas': {
        'bla':       0.250,
        'bla1':        0.300,
        'bla2': 6,
        ...
    },
    'somth1': self.smth1,
    'something': [
        { 'h1': 66.00 },
        { 'h2': 47.00 },
        { 'h3': 85.00 },
        { 'h4': 32.00 },
        { 'h5': 34.00 }
    ],
    'this_has_to_be_object'.field: 1
}

我想要的是让 'this_has_to_be_object' 变成一个真正的对象,这样我就可以往里面添加一些字段并设置值。这样做的目的是为了测试另一个函数,这个函数会使用 'this_has_to_be_object'.field

3 个回答

1

为什么这里不使用一个默认字典呢?比如说:

var  = defaultdict(int)

var.update({
    'blas': {
        'bla':       0.250,
        'bla1':        0.300,
        'bla2': 6,
        ...
    },
    'somth1': self.smth1,
    'something': [
        { 'h1': 66.00 },
        { 'h2': 47.00 },
        { 'h3': 85.00 },
        { 'h4': 32.00 },
        { 'h5': 34.00 }
    ],
    'this_has_to_be_object'.field: 1
}
)

这样的话,var['任何东西']总是会返回0。

我想这正是你在测试中需要的功能,对吧?

1
var = {
'blas': {
    'bla':       0.250,
    'bla1':        0.300,
    'bla2': 6,
    ...
},
'somth1': self.smth1,
'something': [
    { 'h1': 66.00 },
    { 'h2': 47.00 },
    { 'h3': 85.00 },
    { 'h4': 32.00 },
    { 'h5': 34.00 }
],
'this_has_to_be_object':{'field': '1'}

}

这已经是一个对象了,如果你说你想在里面添加一些字段,你可以这样做:

...this_has_to_be_object.newField = 3; 

这不是你想要的吗?

1

命名元组是一种选择,如果它们不需要被修改的话:

from collections import namedtuple

MyTupleType = namedtuple('MyTupleType', ['field'])

yourobject = MyTupleType(field=3)

print(yourobject.field)  # prints 3

如果是为了测试,那么使用 Mock 库也很方便(可以查看 http://www.voidspace.org.uk/python/mock/unittest.mock 从 Python 3.3 开始就已经是标准库的一部分了)。

yourobject = MagicMock()
yourobject.field = 3

注意,你的对象现在有了你尝试访问的 任何 字段或方法,而且它们的值都是另一个 MagicMock 实例。这是一个非常强大的单元测试工具。

最后,你也可以简单地创建一个无聊的虚拟类:

class Dummy(object):
    pass

yourobject = Dummy()
yourobject.field = 3

撰写回答