पायथन वर्ग के माता-पिता कैसे प्राप्त करें?


202

मैं पायथन वर्ग के मूल वर्ग (तों) को कैसे प्राप्त कर सकता हूं?

जवाबों:


233

निम्नलिखित विशेषता का उपयोग करें:

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'>)

1
तात्कालिक वस्तु के आधार प्राप्त करने के लिए type(C()).__bases__नीचे उल्लेखित है
नगरनाराम

106

यदि आप सभी पूर्वजों को केवल तत्काल वालों के बजाय चाहते हैं, तो निरीक्षण का उपयोग करें ।getmro :

import inspect
print inspect.getmro(cls)

उपयोगी रूप से, यह आपको "विधि संकल्प क्रम" में सभी पूर्वजों की कक्षाएं देता है - अर्थात एक विधि को हल करते समय पूर्वजों की जाँच की जाएगी (या, वास्तव में, कोई अन्य विशेषता - विधियाँ और अन्य विशेषताएँ समान नामस्थान में रहती हैं पायथन में, आखिरकार ;-)।


34
तुम भी बस cls.__mro__(कम से कम पायथन 3.5 में) का उपयोग कर सकते हैं
n

@ naught101, plz इसे पूर्ण उत्तर में बदल दें। मैंने लगभग इसे याद किया, और इसलिए, मुझे लगता है कि बहुत से अन्य लोग हैं।
शिहाब शहरियार खान

14

नई शैली की कक्षाओं में एक एमआरओ विधि होती है जिसे आप कॉल कर सकते हैं जो विधि रिज़ॉल्यूशन क्रम में मूल कक्षाओं की सूची देता है।


नई शैली वर्ग के रूप में क्या मायने रखता है? ऐसा लगता है कि मैं इसे Django मॉडल के साथ उपयोग कर सकता हूं, लेकिन कुछ भी जो विरासत में मिला है objectवह इसका जवाब नहीं देता है mro
ब्रायन कुंग

1
एक वस्तु पर विचार x, हम कॉल के साथ विधि संकल्प आदेश प्राप्त कर सकते हैं type(x).mro() अगर हम विचार कर सकते हैं xहै ClassX: के साथ एक आधार वर्ग के रूप में ClassX in type(x).mro()
648trindade

13

सबसे तेज़ तरीका है, सभी माता पिता को देखने के लिए, और में आदेश , बस में बनाया का उपयोग__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सिर्फ अनावश्यक रूप से बादलों का उपयोग करना । यह ईमानदारी से एक शर्म की बात है कि लोगों को सिर्फ बिल्ट-इन का उपयोग करने के लिए पता नहीं है

आशा है कि ये आपकी मदद करेगा!


@ जॉन स्मिथ stackoverflow.com/users/139885/john-smith , मुझे आशा है कि आप यह उत्तर देखेंगे। यदि आप इसे पसंद करते हैं, तो कृपया मुझे एक उत्थान के साथ बताएं!
PyTis

1
वास्तव में, inspect.getmroसिर्फ __mro__ऑब्जेक्ट पर कॉल करें, जैसा कि आप github.com/python/cpython/blob/… में देख सकते हैं । उपयोग करने से getmroक्लीनर और अधिक पठनीय कोड का उत्पादन होता है। हालाँकि फंक्शन कॉल स्किप करना वास्तव में तेज़ है।
tna0y

9

यदि आप सिर्फ माता-पिता को प्राप्त करना चाहते हैं, तो ठिकानों का उपयोग करें __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)

3

यदि आप यह सुनिश्चित करना चाहते हैं कि वे सभी कॉल करें super, सभी स्तरों पर उपयोग करें ।


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