दिए गए वर्ग के पदानुक्रम में सभी आधार वर्गों की सूची बनाएं?


135

एक वर्ग को देखते हुए Foo(चाहे वह नई शैली का वर्ग हो या नहीं), आप सभी आधार वर्गों को कैसे उत्पन्न करते हैं - वंशानुक्रम पदानुक्रम में कहीं भी - इसका issubclass?

जवाबों:


196

inspect.getmro(cls)नए और पुराने दोनों शैली वर्गों के लिए काम करता है और उसी के रूप में रिटर्न करता है NewClass.mro(): विधि संकल्प के लिए उपयोग किए गए क्रम में वर्ग और उसके सभी पूर्वजों की एक सूची।

>>> class A(object):
>>>     pass
>>>
>>> class B(A):
>>>     pass
>>>
>>> import inspect
>>> inspect.getmro(B)
(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)

2
Pyobjc कक्षाओं के लिए काम नहीं करता है :( फ़ाइल "/User/rbp/Projects/zzzzzzz/macmdtypes.py", पंक्ति 70, मोटे प्रिंट निरीक्षण में ।getmro (पथ) फ़ाइल "/System/Library/Frameworks/Python.framework/ संस्करण / 2.7 / lib / python2.7 / inspect.py ", लाइन 348, गेटम्रो सर्चबेस ( cls , परिणाम) फ़ाइल" /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect में .py ", पंक्ति 339, _searchbases में आधार के लिए cls .__ bases_ : AttributeError: ' NSTaggedDate' ऑब्जेक्ट में कोई विशेषता नहीं है '__bases '
rbp

17
@rbp मुझे संदेह है कि आपके पास वही समस्या थी जिसका मुझे सामना करना पड़ा: आप inspect.getmro(obj)इसके बजाय करने की कोशिश कर रहे थे inspect.getmro(type(obj))
esmit

44

एक अजगर पर उपलब्ध __bases__संपत्ति देखें class, जिसमें आधार वर्गों का एक समूह है:

>>> def classlookup(cls):
...     c = list(cls.__bases__)
...     for base in c:
...         c.extend(classlookup(base))
...     return c
...
>>> class A: pass
...
>>> class B(A): pass
...
>>> class C(object, B): pass
...
>>> classlookup(C)
[<type 'object'>, <class __main__.B at 0x00AB7300>, <class __main__.A at 0x00A6D630>]

5
इससे डुप्लिकेट मिल सकता है। और यही कारण है कि दस्तावेज़ के लिए getmroस्पष्ट रूप से कहा गया है "कोई भी वर्ग इस ट्यूपल में एक से अधिक बार दिखाई नहीं देता है"?
श्रीधर रत्नाकुमार

10
सावधानी, __bases__केवल एक स्तर तक बढ़ जाती है । (जैसा कि आपकी पुनरावर्ती उपयोगिता का तात्पर्य है, लेकिन उदाहरण पर एक सरसरी नज़र शायद उस पर नहीं
बॉब स्टीन

32

inspect.getclasstree()वर्गों और उनके ठिकानों की एक नेस्टेड सूची बनाएंगे। उपयोग:

inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.

1
अरे वाह। और यहां तक ​​कि अच्छे आउटपुट के लिए, प्रिंट का उपयोग करें! python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
पेंगुइन 359

20

आप __bases__क्लास ऑब्जेक्ट के टपल का उपयोग कर सकते हैं :

class A(object, B, C):
    def __init__(self):
       pass
print A.__bases__

टपल ने वापसी की __bases__ सभी बेस क्लास हैं।

आशा करता हूँ की ये काम करेगा!


यदि आपकी कक्षा एक वर्ग से विरासत में मिली है, तो श्रृंखला का पहला भाग उसके हिस्से में होगा__bases__
बोरिस

एकल फ़ंक्शन के लिए पूरे मॉड्यूल को आयात किए बिना सरल और साफ।
टेम्पोरोसा

8

अजगर 3.7 में आपको निरीक्षण का आयात करने की आवश्यकता नहीं है, type.mro आपको परिणाम देगा।

>>> class A:
...   pass
... 
>>> class B(A):
...   pass
... 
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>

ध्यान दें कि अजगर 3.x में हर वर्ग बेस ऑब्जेक्ट क्लास से विरासत में मिला है।


8

पायथन डॉक के अनुसार , हम केवल class.__mro__विशेषता या class.mro()विधि का भी उपयोग कर सकते हैं :

>>> class A:
...     pass
... 
>>> class B(A):
...     pass
... 
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> A.__mro__
(<class '__main__.A'>, <class 'object'>)
>>> object.__mro__
(<class 'object'>,)
>>>
>>> B.mro()
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>> A.mro()
[<class '__main__.A'>, <class 'object'>]
>>> object.mro()
[<class 'object'>]
>>> A in B.mro()
True

2

हालाँकि, जोहान का जवाब बहुत मददगार और सही है, क्योंकि आप निरीक्षण मॉड्यूल के .getmro () पद्धति का उपयोग करके वर्ग पदानुक्रम प्राप्त कर सकते हैं, यह भी उजागर करना महत्वपूर्ण है कि पायथन की विरासत पदानुक्रम इस प्रकार है:

उदाहरण के लिए:

class MyClass(YourClass):

एक विरासत वर्ग

  • बाल वर्ग
  • व्युत्पन्न वर्ग
  • उपवर्ग

उदाहरण के लिए:

class YourClass(Object):

विरासत में मिला वर्ग

  • जनक वर्ग
  • आधार वर्ग
  • सुपर क्लास

एक वर्ग दूसरे से विरासत में प्राप्त कर सकता है - वर्ग 'का श्रेय विरासत में मिला है - विशेष रूप से, इसके तरीके विरासत में मिले हैं - इसका मतलब है कि विरासत में प्राप्त (बच्चे) वर्ग के उदाहरण विरासत में मिले (अभिभावक) वर्ग तक पहुँच सकते हैं।

उदाहरण -> वर्ग -> तब विरासत में मिली कक्षाएं

का उपयोग करते हुए

import inspect
inspect.getmro(MyClass)

पाइथन के भीतर आपको पदानुक्रम दिखाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.