Python:如何用getattr获取对象的属性?

gwbalxhn  于 2022-12-02  发布在  Python
关注(0)|答案(7)|浏览(186)

如何评估

a = myobject.id.number

如果myobject为None,则返回None
内置getattr?也许是getattr(myobject, "id.number", None)

pu3pd22g

pu3pd22g1#

这应该可以很好地扩展到任何深度:

reduce(lambda obj, attr : getattr(obj, attr, None), ("id","num"), myobject)
3okqufwl

3okqufwl2#

getattr(getattr(myobject, "id", None), "number", None)

应该可以。

kmpatx3s

kmpatx3s3#

我最喜欢的是

from functools import reduce
try:
  a = reduce(getattr, ("id", "number"), myobject)
except AttributeError:
  a = None

from operator import attrgetter
try:
  a = attrgetter('id.number')(myobject)
except AttributeError:
  a = None
wecizke3

wecizke34#

这里有一句俏皮话

a = myobject is not None and myobject.id.number or None

它不检查id是否为None,但这不是原始问题的一部分。

dhxwm5r4

dhxwm5r45#

这是一个考虑到所有成员的略过于通用的解决方案:

if myobject and myobject.id and myobject.id.number:
    a = myobject.id.number
else:
    a = None
guz6ccqo

guz6ccqo6#

return myobject.id.number if myobject else None
wswtfjt7

wswtfjt77#

我使用下面的函数,它可以为任何级别执行此操作。

def Resolve(object, attribute:str):
  """
  Resolve attribute of an object.
  """
  attribute_list = attribute.split(".")
  obj = object
  try:
    for att in attribute_list:
      obj = getattr(obj, att)
  except AttributeError:
    obj = None
    
  return obj

要使用它,您可以写入:

a = Resolve(myobject, 'id.number')

代码只是使用句点字符拆分字符串,并循环遍历属性。如果您有另一个级别,比如'myobject.id.number.another',您可以用途:

a = Resolve(myobject, 'id.number.another')

相关问题