हम के रूप में OOP के बारे में सोच सकते हैं मॉडलिंग एक प्रणाली के व्यवहार। ध्यान दें कि सिस्टम को 'वास्तविक दुनिया' में मौजूद नहीं होना है, हालांकि वास्तविक दुनिया के रूपक कभी-कभी उपयोगी हो सकते हैं (जैसे "पाइपलाइन", "कारखाने", आदि)।
यदि हमारा वांछित सिस्टम एक साथ सभी मॉडल के लिए बहुत जटिल है, तो हम इसे छोटे टुकड़ों में तोड़ सकते हैं और उन ("समस्या डोमेन") को मॉडल कर सकते हैं, जिनमें आगे टूटना शामिल हो सकता है, और तब तक जब तक हम उन टुकड़ों तक नहीं पहुंच जाते जिनके व्यवहार से मेल खाता है (कम या ज्यादा) कुछ बिल्ट-इन लैंग्वेज ऑब्जेक्ट जैसे नंबर, एक स्ट्रिंग, एक सूची इत्यादि।
एक बार जब हमारे पास वे सरल टुकड़े हो जाते हैं, तो हम उन्हें बड़े टुकड़ों के व्यवहार का वर्णन करने के लिए एक साथ जोड़ सकते हैं, जिसे हम एक साथ मिलकर और भी बड़े टुकड़ों में जोड़ सकते हैं, और इस तरह जब तक हम डोमेन के सभी घटकों का वर्णन कर सकते हैं, जो एक पूरे के लिए आवश्यक हैं। प्रणाली।
यह "एक साथ संयोजन" चरण है जहां हम कुछ कक्षाएं लिख सकते हैं। जब कोई मौजूदा ऑब्जेक्ट नहीं होता है, तो हम कक्षाएं लिखते हैं जो हम चाहते हैं। उदाहरण के लिए, हमारे डोमेन में "फॉस", "बार" कहे जाने वाले फोओस के संग्रह और "बाज़" नामक बार के संग्रह हो सकते हैं। हम देख सकते हैं कि फ़ॉर्स स्ट्रिंग्स के साथ मॉडल करने के लिए पर्याप्त सरल हैं, इसलिए हम ऐसा करते हैं। हम पाते हैं कि सलाखों को कुछ विशेष बाधा का पालन करने के लिए उनकी सामग्री की आवश्यकता होती है जो कि पायथन के किसी भी चीज से मेल नहीं खाती है, इस स्थिति में हम इस बाधा को लागू करने के लिए एक नया वर्ग लिख सकते हैं। शायद बाजों में ऐसी कोई ख़ासियत नहीं है, इसलिए हम सिर्फ एक सूची के साथ उनका प्रतिनिधित्व कर सकते हैं।
ध्यान दें कि हम उन घटकों में से हर एक के लिए एक नया वर्ग लिख सकते हैं (फ़ॉक्स, बार और बाज़), लेकिन हमें सही व्यवहार के साथ पहले से ही कुछ होने की ज़रूरत नहीं है। विशेष रूप से, एक वर्ग के लिए उपयोगी होने के लिए उसे कुछ (डेटा, विधियों, स्थिरांक, उपवर्ग आदि) प्रदान करने की आवश्यकता होती है, इसलिए भले ही हमारे पास कस्टम कक्षाओं की कई परतें हों लेकिन हमें अंततः कुछ अंतर्निहित सुविधा का उपयोग करना चाहिए ; उदाहरण के लिए, अगर हमने फॉस के लिए एक नया वर्ग लिखा है, तो इसमें शायद एक तार होगा, इसलिए फू क्लास को क्यों न भूलें और बार क्लास में इसके बजाय वे तार होते हैं? ध्यान रखें कि कक्षाएं भी एक अंतर्निहित वस्तु हैं, वे सिर्फ एक विशेष रूप से लचीली हैं।
एक बार हमारे पास अपना डोमेन मॉडल होने के बाद, हम उन टुकड़ों के कुछ विशेष उदाहरण ले सकते हैं और उन्हें उस विशेष प्रणाली के "सिमुलेशन" में व्यवस्थित कर सकते हैं जिसे हम मॉडल करना चाहते हैं (उदाहरण के लिए "मशीन सीखने की प्रणाली ...")।
एक बार जब हमारे पास यह सिमुलेशन होता है, तो हम इसे चला सकते हैं और हे presto, हमारे पास एक काम कर रहे हैं (एक) मशीन लर्निंग सिस्टम के लिए ... (या जो भी हम मॉडलिंग कर रहे थे)।
अब, अपनी विशेष स्थिति में आप "फीचर एक्सट्रैक्टर" घटक के व्यवहार को मॉडल करने का प्रयास कर रहे हैं। सवाल यह है कि क्या कोई अंतर्निहित वस्तुएं हैं जो एक "फीचर एक्सट्रैक्टर" की तरह व्यवहार करती हैं, या आपको इसे सरल चीजों में तोड़ने की आवश्यकता होगी? ऐसा लगता है कि फीचर एक्सट्रैक्टर्स फ़ंक्शन ऑब्जेक्ट्स की तरह बहुत व्यवहार करते हैं, इसलिए मुझे लगता है कि आप अपने मॉडल के रूप में उन का उपयोग करना ठीक होगा।
इस प्रकार की अवधारणाओं के बारे में सीखते समय एक बात का ध्यान रखें कि विभिन्न भाषाएं अलग-अलग अंतर्निहित विशेषताओं और वस्तुओं को प्रदान कर सकती हैं (और, निश्चित रूप से, कुछ भी "वस्तुओं" जैसी शब्दावली का उपयोग नहीं करते हैं!)। इसलिए जो समाधान एक भाषा में समझ में आते हैं वे दूसरे में कम उपयोगी हो सकते हैं (यह एक ही भाषा के विभिन्न संस्करणों पर भी लागू हो सकता है!)।
ऐतिहासिक रूप से, बहुत से ओओपी साहित्य (विशेषकर "डिजाइन पैटर्न") ने जावा पर ध्यान केंद्रित किया है, जो पायथन से काफी अलग है। उदाहरण के लिए, जावा कक्षाएं ऑब्जेक्ट नहीं हैं, जावा के पास बहुत समय तक फ़ंक्शन ऑब्जेक्ट नहीं हैं, जावा में सख्त प्रकार की जांच है (जो इंटरफेस और सबक्लासिंग को प्रोत्साहित करता है) जबकि पायथन डक-टाइपिंग को प्रोत्साहित करता है, जावा में मॉड्यूल ऑब्जेक्ट्स, जावा पूर्णांक / नहीं है तैरता / आदि। ऑब्जेक्ट नहीं हैं, जावा में मेटा-प्रोग्रामिंग / आत्मनिरीक्षण के लिए "प्रतिबिंब" की आवश्यकता होती है, और इसी तरह।
मैं जावा पर लेने की कोशिश नहीं कर रहा हूं (एक अन्य उदाहरण के रूप में, बहुत से ओओपी सिद्धांत स्मॉलटाकल के आसपास घूमता है, जो फिर से पायथन से बहुत अलग है), मैं सिर्फ यह बताने की कोशिश कर रहा हूं कि हमें संदर्भ के बारे में बहुत सावधानी से सोचना चाहिए और जिन बाधाओं का समाधान विकसित किया गया था, और क्या यह उस स्थिति से मेल खाता है जो हम कर रहे हैं।
आपके मामले में, एक फ़ंक्शन ऑब्जेक्ट एक अच्छा विकल्प की तरह लगता है। यदि आप सोच रहे हैं कि क्यों कुछ "सर्वश्रेष्ठ अभ्यास" दिशानिर्देश किसी संभावित समाधान के रूप में फ़ंक्शन ऑब्जेक्ट का उल्लेख नहीं करते हैं, तो यह केवल इसलिए हो सकता है क्योंकि उन दिशानिर्देशों को जावा के पुराने संस्करणों के लिए लिखा गया था!