2013-08-19 5 views
7

क्या कोई कक्षा नहीं है जो सभी कक्षाओं को पायथन मॉड्यूल से नामहीन वस्तुओं की सूची में शुरू करने का कोई तरीका है?किसी मॉड्यूल में सभी कक्षाओं को नामांकित वस्तुओं में नामांकित वस्तुओं में आरंभ करें

उदाहरण मैं एक मॉड्यूल rules जो एक वर्ग नियम से सभी बच्चे कक्षाओं में शामिल किया है। क्योंकि इस बात का, मैं कुछ कर रहा हूँ कि वे सब एक विधि run() को लागू करेगा और एक विशेषता name जो __init__

की कॉल मैं वस्तुओं गतिशील उन वर्गों से शुरू की की एक सूची है चाहते हैं के दौरान उत्पन्न हो जाएगा होगा। गतिशील रूप से शुरूआत से मेरा मतलब है कि उन्हें स्पष्ट रूप से नामित नहीं करना है।

प्रश्न हैं:

यह एक मॉड्यूल में सभी वर्गों के माध्यम से पुनरावृति करना संभव है?

क्या एक नामहीन वस्तु शुरू की जा सकती है?

उत्तर

8

कम से कम दो दृष्टिकोण आप ले सकते हैं। आप कक्षा के __subclasses__() विधि को कॉल करके कक्षा के सभी उप-वर्ग प्राप्त कर सकते हैं। इसलिए यदि आपके माता-पिता वर्ग Rule कहा जाता है, आप कह सकते हैं:

rule_list = [cls() for cls in Rule.__subclasses__()] 

यह Rule की आप सभी उपवर्गों दे देंगे, और उन्हें लोगों को एक विशेष मॉड्यूल में पाया करने के लिए सीमित नहीं होगा।

यदि आपके पास अपने मॉड्यूल के लिए हैंडल है, तो आप इसकी सामग्री को फिर से सक्रिय कर सकते हैं। इसलिए जैसा:

import rule 
rule_list = [] 
for name in dir(rule): 
    value = getattr(rule, name) 
    if isinstance(value, type) and issubclass(value, Rule): 
     rule_list.append(value()) 

दुर्भाग्य से, issubclass फेंकता TypeError यदि आप इसे एक वस्तु है कि इसके पहले तर्क के रूप में एक वर्ग नहीं है दे। तो आपको किसी भी तरह से इसे संभालना होगा।

संपादित करें: issubclass प्रति क्विर्क प्रति @ ब्लैककॉन्ग के सुझाव से निपटना।

+0

मेरे उत्तर से बेहतर। आप 'TypeError' से बचने के लिए' inspect.isclass() 'का उपयोग कर सकते हैं। –

+0

@ एंटोनिस क्रिस्टोफाइड्स ट्रू, आप फ़िल्टर के रूप में 'inspect.isclass()' का उपयोग कर सकते हैं। हालांकि, मैं उत्पादन कोड में 'निरीक्षण' मॉड्यूल से कुछ भी उपयोग करने से बचने की कोशिश करता हूं। –

+0

यह सुनिश्चित करने के लिए कि आपके पास कक्षा है, आप 'इंस्टेंसेंस (वैल्यू, टाइप)' का भी उपयोग कर सकते हैं। (यदि आपको पुरानी शैली के वर्गों का समर्थन करने की आवश्यकता है, तो आपको 'type.ClassType' की जांच करने की भी आवश्यकता होगी, लेकिन मैं इसके बजाय उनसे बचूंगा।) – Blckknght

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