繁体   English   中英

Python:如何用getattr得到一个object属性属性?

[英]Python: How to get attribute of attribute of an object with getattr?

我如何评价

a = myobject.id.number

如果 myobject 为 None,则返回None

内置getattr 也许getattr(myobject, "id.number", None)

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

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

应该管用。

这是一个单行

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

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

一个稍微过于通用的解决方案,让所有成

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

我最喜欢的是

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

我使用以下 function,它适用于任何级别。

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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM