Python 字典键与对象属性
假设我有一个对象,它有一个叫做'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.get
和getattr
的参数很相似。它们都可以接受一个可选的默认值。不过要注意,如果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)