<p>在<code>__getattr__</code>和<code>operator.attrgetter</code>之间,您可以很容易地完成这项工作:</p>
<pre><code>class DataObj(object):
def __init__(self, cvid, cvname, address, get_info):
self.cvid = cvid
self.cvname = cvname
self.address = address
self.prof = PROF("Honda", "Jason Jones")
def __getattr__(self, name):
# Called when an attribute is accessed which is not found on DataObj
# You can limit the loop to avoid checking some attributes, or
# remove the loop if only self.prof should be checked
for member in (self.cvid, self.cvname, self.address, self.prof):
try:
return getattr(member, name)
except AttributeError:
pass
raise AttributeError(name)
# If only self.prof should be checked, the function could simplify to:
# return getattr(self.prof, name)
</code></pre>
<p>然后,您可以创建一个简单的实用程序函数,该函数针对<code>DataObj</code>运行,以从中获取任意一组键值对:</p>
<pre><code>from operator import attrgetter
def extractdata(dataobj, *names):
return dict(zip(names, attrgetter(*names)(dataobj)))
</code></pre>
<p>或者作为<code>DataObj</code>的成员,只需命名第一个与约定匹配的参数<code>self</code>:</p>
<pre><code>def extractdata(self, *names):
return dict(zip(names, attrgetter(*names)(self)))
</code></pre>
<p><code>__getattr__</code>允许将属性查找委托给包含的对象,<code>attrgetter</code>允许您以简单的方式检索一组任意属性。你知道吗</p>