<p>最适合的可能是<a href="https://docs.python.org/2/library/operator.html#operator.attrgetter" rel="noreferrer">^{<cd1>}</a>:</p>
<pre><code>from operator import attrgetter
foo_member = attrgetter('foo')
bar_member = attrgetter('bar')
baz_member = attrgetter('baz')
class Example(object):
def __init__(self):
self.foo = 1
@property
def bar(self):
return 2
def baz(self):
return 3
example_object = Example()
print foo_member(example_object) # prints 1
print bar_member(example_object) # prints 2
print baz_member(example_object)() # prints 3
</code></pre>
<p><code>attrgetter</code>所采用的机制与普通的点式访问完全相同,因此它适用于任何使用点访问的对象。实例字段、方法、模块成员、动态计算的属性等等。对象的类型也不重要;例如,<code>attrgetter('count')</code>可以检索列表、元组、字符串的<code>count</code>属性,或者其他任何具有<code>count</code>属性的对象。在</p>
<hr/>
<p>对于某些类型的属性,可能有更具体的成员指针之类的东西。例如,对于实例方法,可以检索未绑定方法:</p>
^{pr2}$
<p>这要么是实现该方法的特定函数,要么是围绕该函数的非常薄的包装器,具体取决于Python版本。它是类型特定的;<code>list.count</code>不适用于元组,<code>tuple.count</code>不适用于列表。在</p>
<p>对于属性,可以检索属性对象的<code>fget</code>、<code>fset</code>和{<cd10>},这些函数实现获取、检索和删除属性管理的属性:</p>
<pre><code>example_bar_member = Example.bar.fget
print example_bar_member(example_object) # prints 2
</code></pre>
<p>我们没有为这个属性实现setter或deleter,因此<code>fset</code>和{<cd10>}是{<cd13>}。这些也是特定于类型的;例如,如果<code>example_bar_member</code>处理正确的列表,<code>example_bar_member([])</code>将引发一个<code>AttributeError</code>,而不是返回{<cd17>},因为列表没有<code>bar</code>属性。在</p>