2013-08-01 15 views
6

मैं ऑब्जेक्ट्स की सूची पर object.method() पर कॉल करने का प्रयास कर रहा हूं।ऑब्जेक्ट्स की सूची पर क्लास विधियों को कॉल करने के लिए मानचित्र() का उपयोग कैसे करें

मैं इस की कोशिश की है, लेकिन यह काम करने के लिए नहीं मिल सकता है ठीक से

newList = map(method, objectList) 

मैं त्रुटि method is not defined मिलता है लेकिन मुझे पता है कि है, क्योंकि यह एक वर्ग विधि और नहीं एक स्थानीय कार्य है।

क्या map(), या इसी तरह के फ़ंक्शन में ऐसा करने का कोई तरीका है? या मुझे जनरेटर/सूची समझ का उपयोग करना होगा?

संपादित करें क्या आप इस सूची की समझ का उपयोग करने के अपने फायदे के फायदे या इसके विपरीत को भी समझ सकते हैं?

newList = [object.method() for object in objectList] 

उत्तर

6

newList = map(method, objectList) पर पर method(object) पर कॉल करेगा।

रास्ता नक्शे के साथ यह करने के लिए एक लैम्ब्डा समारोह, जैसे की आवश्यकता होगी:

map(lambda obj: obj.method(), objectlist) 

एक सूची समझ हो सकता है मामूली तेजी से, आप के रूप में देखकर एक लैम्ब्डा है, जो कुछ भूमि के ऊपर है की जरूरत नहीं होगी (थोड़ा here पर चर्चा की)।

+2

एक छोटी सी अतिरिक्त: 'new_lister = लैम्ब्डा विधि, objectList: मानचित्र (लैम्ब्डा obj: obj.method(), objectList)' आप किसी भी पुराने 'method' और किसी भी पुराने' objectList' उपयोग करने में सक्षम होना चाहते हैं। अब आप 'newList = new_lister (foo_method, list_of_foos) 'आदि कर सकते हैं – 2rs2ts

+0

क्या आप लैम्ब्डा फ़ंक्शन के उपयोग की व्याख्या कर सकते हैं?मैंने सोचा कि मानचित्र सूची के पैरामीटर को फ़ंक्शन के पैरामीटर के रूप में पास करता है। लैम्ब्डा फ़ंक्शन ऑब्जेक्ट्स को पैरामीटर के रूप में कैसे स्वीकार करता है? – Stephan

+0

'lambda obj: obj.method()' के बराबर है: 'def foo (obj): obj.method'। तो 'मानचित्र' वास्तव में सूची के तत्वों को पैरामीटर के रूप में गुजर रहा है। प्रत्येक तत्व को लैम्बडा का पहला तर्क 'ओबीजे' के रूप में पारित किया जाएगा। सही बात? –

3

यदि सूची की सामग्री एक ही कक्षा के सभी उदाहरण हैं, तो आप कक्षा के नाम के साथ विधि नाम उपसर्ग कर सकते हैं।

class Fred: 
    def __init__(self, val): 
     self.val = val 
    def frob(self): 
     return self.val 

freds = [Fred(4), Fred(8), Fred(15)] 
print map(Fred.frob, freds) 

परिणाम:

[4, 8, 15] 

यह भी किया जा सकता है, तो सूची के तत्वों निर्दिष्ट वर्ग के उपवर्गों हैं। हालांकि, यह अभी भी विधि के निर्दिष्ट कार्यान्वयन को कॉल करेगा, भले ही उस विधि को सबक्लास में ओवरराइड किया गया हो। उदाहरण:

class Fred: 
    def __init__(self, val): 
     self.val = val 
    def frob(self): 
     return self.val 

class Barney(Fred): 
    def frob(self): 
     return self.val * 2 

freds = [Fred(4), Barney(8), Barney(15)] 
#You might expect the barneys to return twice their val. ex. [4, 16, 30] 
#but the actual output is [4, 8, 15] 
print map(Fred.frob, freds) 
+2

यदि सूची में ऐसी वस्तुएं हैं जो कम से कम उप-वर्गों पर नहीं हैं तो यह असफल हो जाएगी। –

+0

हां, मैं उस प्रभाव के लिए अस्वीकरण में संपादित करूंगा। – Kevin

+0

क्या यह 'स्वयं' तर्क का उपयोग करके 'मानचित्र()' के साथ कुछ करने के लिए है क्योंकि नक्शा दूसरे तर्क को पहले तर्क में परिभाषित फ़ंक्शन के पैरामीटर के रूप में पास करता है? मुझे ऐसा कोई मामला कभी नहीं मिला है जहां मुझे उस तर्क को समझना पड़ा। – Stephan

10

उपयोग operator.methodcaller():

from operator import methodcaller 

map(methodcaller('methodname'), object_list) 

यह वस्तुओं सभी एक ही विधि (नाम से) है कि किसी भी सूची के लिए काम करता है; इससे कोई फर्क नहीं पड़ता कि सूची में विभिन्न प्रकार हैं या नहीं।

+4

जीज़, क्या आपको याद है कि इन सभी उपयोगी कार्यों को आपके सिर के शीर्ष से दूर किया गया है? – Stephan

संबंधित मुद्दे

 संबंधित मुद्दे