एक वर्ग को देखते हुए Foo
(चाहे वह नई शैली का वर्ग हो या नहीं), आप सभी आधार वर्गों को कैसे उत्पन्न करते हैं - वंशानुक्रम पदानुक्रम में कहीं भी - इसका issubclass
?
एक वर्ग को देखते हुए Foo
(चाहे वह नई शैली का वर्ग हो या नहीं), आप सभी आधार वर्गों को कैसे उत्पन्न करते हैं - वंशानुक्रम पदानुक्रम में कहीं भी - इसका issubclass
?
जवाबों:
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'>)
inspect.getmro(obj)
इसके बजाय करने की कोशिश कर रहे थे inspect.getmro(type(obj))
।
एक अजगर पर उपलब्ध __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>]
getmro
स्पष्ट रूप से कहा गया है "कोई भी वर्ग इस ट्यूपल में एक से अधिक बार दिखाई नहीं देता है"?
__bases__
केवल एक स्तर तक बढ़ जाती है । (जैसा कि आपकी पुनरावर्ती उपयोगिता का तात्पर्य है, लेकिन उदाहरण पर एक सरसरी नज़र शायद उस पर नहीं
inspect.getclasstree()
वर्गों और उनके ठिकानों की एक नेस्टेड सूची बनाएंगे। उपयोग:
inspect.getclasstree(inspect.getmro(IOError)) # Insert your Class instead of IOError.
python -c 'import inspect; from pprint import pprint as pp; pp(inspect.getclasstree(inspect.getmro(IOError)))'
आप __bases__
क्लास ऑब्जेक्ट के टपल का उपयोग कर सकते हैं :
class A(object, B, C):
def __init__(self):
pass
print A.__bases__
टपल ने वापसी की __bases__
सभी बेस क्लास हैं।
आशा करता हूँ की ये काम करेगा!
__bases__
अजगर 3.7 में आपको निरीक्षण का आयात करने की आवश्यकता नहीं है, type.mro आपको परिणाम देगा।
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> type.mro(B)
[<class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
>>>
ध्यान दें कि अजगर 3.x में हर वर्ग बेस ऑब्जेक्ट क्लास से विरासत में मिला है।
पायथन डॉक के अनुसार , हम केवल 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
हालाँकि, जोहान का जवाब बहुत मददगार और सही है, क्योंकि आप निरीक्षण मॉड्यूल के .getmro () पद्धति का उपयोग करके वर्ग पदानुक्रम प्राप्त कर सकते हैं, यह भी उजागर करना महत्वपूर्ण है कि पायथन की विरासत पदानुक्रम इस प्रकार है:
उदाहरण के लिए:
class MyClass(YourClass):
एक विरासत वर्ग
उदाहरण के लिए:
class YourClass(Object):
विरासत में मिला वर्ग
एक वर्ग दूसरे से विरासत में प्राप्त कर सकता है - वर्ग 'का श्रेय विरासत में मिला है - विशेष रूप से, इसके तरीके विरासत में मिले हैं - इसका मतलब है कि विरासत में प्राप्त (बच्चे) वर्ग के उदाहरण विरासत में मिले (अभिभावक) वर्ग तक पहुँच सकते हैं।
उदाहरण -> वर्ग -> तब विरासत में मिली कक्षाएं
का उपयोग करते हुए
import inspect
inspect.getmro(MyClass)
पाइथन के भीतर आपको पदानुक्रम दिखाएगा।