2017-08-03 27 views
0

我想映射在性能應用`map`對財產,所以我試圖在python

map(lambda o: cls.prop(o), list_of_objects) 

的屬性在外部庫定義爲:

@property 
def prop(self): 

然而,我收到TypeError錯誤。

我測試了它「未映射」,並且cls.prop(an_object)工作得很好,因爲它應該是,相當於an_object.prop

我在做什麼錯?我怎麼能做到這一點?

(我知道列表理解[o.prop for o in list_of_objects],但我想學習和理解上面出了什麼問題)。

+1

我強烈懷疑未映射的訪問工作。如果有的話,你沒有財產。 –

回答

7

在類上訪問的屬性返回property對象本身,而不是包裝函數。一個屬性包裝功能,吸氣,setter和刪除器(每一種可None):

>>> class Foo(object): 
...  @property 
...  def prop(self): 
...   return 'bar' 
... 
>>> Foo.prop 
<property object at 0x107102bd8> 
>>> Foo.prop.fget, Foo.prop.fset, Foo.prop.fdel 
(<function Foo.prop at 0x1073366a8>, None, None) 

您需要訪問fget屬性得到公正,吸氣:

map(lambda o: cls.prop.fget(o), list_of_objects) 

但是,這是矯枉過正,直接訪問該屬性:

map(lambda o: o.prop, list_of_objects) 

或使用一個operator.attrgetter() object

from operator import attrgetter 

map(attrgetter('prop'), list_of_objects) 

後者的優點是在map()的C循環將不會後退一步到Python解釋器來執行lambda字節碼的優勢,attrgetter()可以做的工作完全用C使得組合更快。

+0

'map(lambda o:o.prop,list_of_objects)'我不知道我怎麼沒看到這個!我覺得我好笨。將使用'attrgetter',感謝分享知識。性能! –