पाइथन में, मॉड्यूल एक्स और क्लास वाई दिया गया है, मैं मॉड्यूल एक्स में मौजूद वाई के सभी उप-वर्गों की सूची को पुन: उत्पन्न या उत्पन्न कैसे कर सकता हूं?किसी दिए गए मॉड्यूल में दिए गए वर्ग के उप-वर्गों पर इटरेट
उत्तर
यहाँ एक तरीका यह करना है:
import inspect
def get_subclasses(mod, cls):
"""Yield the classes in module ``mod`` that inherit from ``cls``"""
for name, obj in inspect.getmembers(mod):
if hasattr(obj, "__bases__") and cls in obj.__bases__:
yield obj
class foo(object): pass
class bar(foo): pass
class baz(foo): pass
class grar(Exception): pass
def find_subclasses(module, clazz):
for name in dir(module):
o = getattr(module, name)
try:
if issubclass(o, clazz):
yield name, o
except TypeError: pass
>>> import foo
>>> list(foo.find_subclasses(foo, foo.foo))
[('bar', <class 'foo.bar'>), ('baz', <class 'foo.baz'>), ('foo', <class 'foo.foo'>)]
>>> list(foo.find_subclasses(foo, object))
[('bar', <class 'foo.bar'>), ('baz', <class 'foo.baz'>), ('foo', <class 'foo.foo'>), ('grar', <class 'foo.grar'>)]
>>> list(foo.find_subclasses(foo, Exception))
[('grar', <class 'foo.grar'>)]
foo.py मॉड्यूल को देखते हुए मैं सुझाव दे सकते हैं कि क्रिस Atlee और zacherates से जवाब न आवश्यकताओं को पूरा? मुझे लगता है कि zacerates जवाब देने के लिए इस संशोधन है बेहतर:
def find_subclasses(module, clazz):
for name in dir(module):
o = getattr(module, name)
try:
if (o != clazz) and issubclass(o, clazz):
yield name, o
except TypeError: pass
कारण मैं दिए गए उत्तर से असहमत है कि पहले कक्षाएं कि किसी वर्ग का दूर का उपवर्ग हैं उत्पादन नहीं करता है, और दूसरा दी शामिल है कक्षा।
हालांकि क्वात्राना का सुझाव ठीक काम करता है, फिर भी कुछ संभावित सुधार हैं जो मैं इसे अधिक पाइथनिक बनाने के लिए सुझाव देना चाहता हूं। वे मानक पुस्तकालय से निरीक्षण मॉड्यूल का उपयोग करने पर भरोसा करते हैं।
- आप
inspect.getmembers()
- ट्राई/कैच का उपयोग करके getattr कॉल से बच सकते हैं
inspect.isclass()
का उपयोग करके बचा जा सकता है, तो आप यदि आप एक ही सूची समझ करने के लिए पूरी बात कम कर सकते हैं जैसे:
def find_subclasses(module, clazz):
return [
cls
for name, cls in inspect.getmembers(module)
if inspect.isclass(cls) and issubclass(cls, clazz)
]
बहुत अच्छा काम करता है, लेकिन मेरी प्रतिक्रिया बेस क्लास (जिसे मैं क्लैज के साथ भेजता हूं) देता हूं, कोई विचार? – fredrik
फ्रेड्रिक, जारी करने के लिए जारी करता है (फू, फू) सच है। हालांकि आसान फिक्स। सूची समझने के लिए "और सीएल क्लैज नहीं है" – runeh
-1: कोड काम नहीं करता है। यह सही होगा: 'नाम के लिए cls, inspect.getmembers (मॉड्यूल) में cls' – tback
- 1. किसी दिए गए थ्रेड
- 2. किसी दिए गए बिंदु
- 3. किसी दिए गए कुंजी
- 4. किसी दिए गए बिंदु
- 5. किसी दिए गए आकार
- 6. किसी दिए गए रंग
- 7. किसी दिए गए आईडी
- 8. किसी दिए गए नंबर
- 9. किसी दिए गए नंबर
- 10. किसी दिए गए नोड
- 11. किसी दिए गए यूआरएल
- 12. किसी दिए गए हैशटैग
- 13. किसी दिए गए स्ट्रिंग
- 14. किसी दिए गए फ़ाइल
- 15. किसी दिए गए समयावधि
- 16. किसी दिए गए दिनांक
- 17. किसी दिए गए क्रमपरिवर्तन
- 18. किसी दिए गए पैटर्न
- 19. किसी दिए गए शब्द
- 20. किसी दिए गए पथ
- 21. किसी दिए गए विस्तार
- 22. किसी दिए गए यूटीटाइप
- 23. किसी दिए गए फ़ॉन्ट
- 24. किसी दिए गए पथ
- 25. किसी दिए गए बिंदु पर निकटतम बिंदु
- 26. XSLT किसी दिए गए मान
- 27. एल्गोरिदम किसी दिए गए लंबाई
- 28. एल्गोरिदम किसी दिए गए स्ट्रिंग
- 29. किसी दिए गए लाइन नंबर
- 30. किसी दिए गए यूनिकोड श्रेणी
मेरा समाधान उन वर्गों को वापस नहीं करेगा जो 'cls' के प्रत्यक्ष वंशज नहीं हैं। नीचे क्वात्राना का समाधान किसी भी वर्ग को मिलेगा जिसमें उसके पूर्वजों में कहीं भी 'cls' है। –