Python 字典键与对象属性

6 投票
3 回答
4273 浏览
提问于 2025-04-16 01:30

假设我有一个对象,它有一个叫做'dlist0'的键,并且这个键里面有一个属性'row_id',我可以这样访问它:

getattr(dlist0,'row_id')

这样就能得到值。

但是如果我有一个字典:

ddict0 = {'row_id':4, 'name':'account_balance'}
getattr(ddict0,'row_id')

这样就不行了。

我的问题是,怎么才能以同样的方式访问ddict0和dlist0呢?

有没有人能帮帮我?

3 个回答

0

虽然和@Amber的回答有点相似,但下面的内容更简洁一些,并且可以让我们设置一个默认值。它可以获取一个dict中的项或者一个object的属性:

def get(*args):
    _get = dict.get if type(args[0]) is dict else getattr
    return _get(*args)

dict.getgetattr的参数很相似。它们都可以接受一个可选的默认值。不过要注意,如果getattr要获取的属性不存在,而你又没有明确指定默认值的话,它会报错。

这里有一些简单的例子:

>>> get({'my_key': 'my_value'}, 'my_key')
'my_value'
>>> class MyClass(object): pass
...
>>> get(MyClass(), 'my_attr_name', 'missing')
'missing'
1

也许使用namedtuple会更适合你的需求。

>>> from collections import namedtuple
>>> AccountBalance=namedtuple('account_balance','row_id name')
>>> ddict0=AccountBalance(**{'row_id':4, 'name':'account_balance'})
>>> getattr(ddict0,'row_id')
4

>>> ddict0._asdict()
{'row_id': 4, 'name': 'account_balance'}
8

字典里有很多项,所以它们用 __getitem__() 这个方法来获取某个键对应的值。

对象有属性,因此它们用 __getattr__() 这个方法来获取某个属性的值。

理论上,你可以把其中一个方法改成指向另一个方法,如果你需要这样做的话。但问题是,为什么要这样做呢?不如直接写一个辅助函数来解决问题:

Python 2.x:

def get_value(some_thing, some_key):
    if type(some_thing) in ('dict','tuple','list'):
        return some_thing[some_key]
    else:
        return getattr(some_thing, some_key)

Python 3.x:

def get_value(some_thing, some_key):
    if type(some_thing) in (dict,tuple,list):
        return some_thing[some_key]
    else:
        return getattr(some_thing, some_key)

撰写回答