जवाबों:
निम्नलिखित विशेषता का उपयोग करें:
cls.__bases__
से डॉक्स :
एक वर्ग वस्तु के आधार वर्गों का टपल।
उदाहरण:
>>> str.__bases__
(<type 'basestring'>,)
एक और उदाहरण:
>>> class A(object):
... pass
...
>>> class B(object):
... pass
...
>>> class C(A, B):
... pass
...
>>> C.__bases__
(<class '__main__.A'>, <class '__main__.B'>)
यदि आप सभी पूर्वजों को केवल तत्काल वालों के बजाय चाहते हैं, तो निरीक्षण का उपयोग करें ।getmro :
import inspect
print inspect.getmro(cls)
उपयोगी रूप से, यह आपको "विधि संकल्प क्रम" में सभी पूर्वजों की कक्षाएं देता है - अर्थात एक विधि को हल करते समय पूर्वजों की जाँच की जाएगी (या, वास्तव में, कोई अन्य विशेषता - विधियाँ और अन्य विशेषताएँ समान नामस्थान में रहती हैं पायथन में, आखिरकार ;-)।
cls.__mro__
(कम से कम पायथन 3.5 में) का उपयोग कर सकते हैं
नई शैली की कक्षाओं में एक एमआरओ विधि होती है जिसे आप कॉल कर सकते हैं जो विधि रिज़ॉल्यूशन क्रम में मूल कक्षाओं की सूची देता है।
object
वह इसका जवाब नहीं देता है mro
।
x
, हम कॉल के साथ विधि संकल्प आदेश प्राप्त कर सकते हैं type(x).mro()
अगर हम विचार कर सकते हैं x
है ClassX
: के साथ एक आधार वर्ग के रूप में ClassX in type(x).mro()
सबसे तेज़ तरीका है, सभी माता पिता को देखने के लिए, और में आदेश , बस में बनाया का उपयोग__mro__
अर्थात repr(YOUR_CLASS.__mro__)
>>>
>>>
>>> import getpass
>>> getpass.GetPassWarning.__mro__
आउटपुट, में आदेश
(<class 'getpass.GetPassWarning'>, <type 'exceptions.UserWarning'>,
<type 'exceptions.Warning'>, <type 'exceptions.Exception'>,
<type 'exceptions.BaseException'>, <type 'object'>)
>>>
ये लो। अभी "सर्वश्रेष्ठ" उत्तर में, 182 वोट हैं (जैसा कि मैं यह टाइप कर रहा हूं), लेकिन यह लूप के लिए कुछ जटिल की तुलना में बहुत सरल है, एक समय में एक वर्ग को देखता है , यह उल्लेख करने के लिए नहीं कि कब एक वर्ग TWO या उसके माता-पिता का विस्तार करता है कक्षाएं। आयात करना और inspect
सिर्फ अनावश्यक रूप से बादलों का उपयोग करना । यह ईमानदारी से एक शर्म की बात है कि लोगों को सिर्फ बिल्ट-इन का उपयोग करने के लिए पता नहीं है
आशा है कि ये आपकी मदद करेगा!
inspect.getmro
सिर्फ __mro__
ऑब्जेक्ट पर कॉल करें, जैसा कि आप github.com/python/cpython/blob/… में देख सकते हैं । उपयोग करने से getmro
क्लीनर और अधिक पठनीय कोड का उत्पादन होता है। हालाँकि फंक्शन कॉल स्किप करना वास्तव में तेज़ है।
यदि आप सिर्फ माता-पिता को प्राप्त करना चाहते हैं, तो ठिकानों का उपयोग करें __mro__
(जैसा कि @ naught101 द्वारा बताया गया है) विधि रिज़ॉल्यूशन ऑर्डर प्राप्त करने के लिए (ताकि यह पता चले कि किस क्रम में इनिट निष्पादित किए गए थे)।
मामले (और पहले किसी मौजूदा वस्तु के लिए कक्षा प्राप्त करना):
>>> some_object = "some_text"
>>> some_object.__class__.__bases__
(object,)
हाल के पायथन संस्करणों में एमआरओ के लिए:
>>> some_object = "some_text"
>>> some_object.__class__.__mro__
(str, object)
जाहिर है, जब आपके पास पहले से ही एक वर्ग की परिभाषा है, तो आप __mro__
सीधे उस पर कॉल कर सकते हैं:
>>> class A(): pass
>>> A.__mro__
(__main__.A, object)
यदि आप यह सुनिश्चित करना चाहते हैं कि वे सभी कॉल करें super
, सभी स्तरों पर उपयोग करें ।
type(C()).__bases__
नीचे उल्लेखित है