2012-09-25 10 views
5

मैं अजगर के लिए नया हूं और कक्षाओं की एक सूची प्राप्त करने की कोशिश कर रहा हूं जिसमें किसी ऑब्जेक्ट की कक्षा से विरासत प्राप्त होती है। मैं bases विशेषता का उपयोग करके ऐसा करने की कोशिश कर रहा हूं लेकिन मुझे कोई सफलता नहीं मिली है। क्या कोई व्यक्ति कृपा करके मेरी सहायता करेगा?पाइथन में कक्षा विरासत

def foo(C): 
    print(list(C.__bases__)) 

class Thing(object): 
    def f(self): 
     print("Yo") 

class Shape(Thing): 
    def l(self): 
     print("ain't no thang") 

class Circle(Shape): 
    def n(self): 
     print("ain't no shape") 

test = Circle() 
foo(test) 

उत्तर

6

केवल कक्षाओं में __bases__ है; कक्षा के उदाहरण नहीं करते हैं। आप कक्षा के ऑब्जेक्ट को __class__ के माध्यम से प्राप्त कर सकते हैं: foo(test.__class__) या foo(Circle) का उपयोग करें।

+0

आपको बहुत बहुत धन्यवाद –

4

उपयोग inspect, documentation

वापसी cls सहित वर्ग cls के आधार वर्ग, के एक टपल, विधि संकल्प क्रम में से। इस tuple में कोई कक्षा एक से अधिक बार प्रकट होता है। नोट कि विधि संकल्प आदेश cls के प्रकार पर निर्भर करता है। जब तक कि बहुत असाधारण उपयोगकर्ता-परिभाषित मेटाटाइप उपयोग में नहीं है, तो cls tuple का पहला तत्व होगा।

>>> import inspect 
>>> inspect.getmro(test.__class__) 
(<class '__main__.Circle'>, <class '__main__.Shape'>, <class '__main__.Thing'>, <type 'object'>) 
>>> 

यह & प्रिंट सभी वर्गों, object सहित वंशानुगत पदानुक्रम अप को पार करता। बहुत अच्छा आह?

+0

+1 के बाद से यह कक्षाओं के सभी की एक सूची देता है। ओपी के उदाहरण के साथ काम करने के लिए, मुझे विश्वास है कि यह 'test'__ class__' होना चाहिए क्योंकि 'test' उसके मामले में एक उदाहरण है? – RocketDonkey

+0

हाँ यह 'test.__ class__' होना चाहिए, जवाब देने में जल्दबाजी में था :) –

+0

मुझे एहसास पता है :) – RocketDonkey

1

foo का आपका कार्यान्वयन कार्य करता है। लेकिन आपको एक कक्षा को foo पर पास करने की आवश्यकता नहीं है, उदाहरण के लिए नहीं।

In [1]: def foo(C): 
    ...:   print(list(C.__bases__)) 
    ...: 

In [2]: class Thing(object): 
    ...:   def f(self): 
    ...:     print("Yo") 
    ...: 

In [3]: class Shape(Thing): 
    ...:   def l(self): 
    ...:     print("ain't no thang") 
    ...: 

In [4]: class Circle(Shape): 
    ...:   def n(self): 
    ...:     print("ain't no shape") 
    ...: 

In [5]: test = Circle() 

In [6]: foo(test) 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-6-7b85deb1beaa> in <module>() 
----> 1 foo(test) 

<ipython-input-1-acd1789d43a9> in foo(C) 
     1 def foo(C): 
----> 2   print(list(C.__bases__)) 
     3 

AttributeError: 'Circle' object has no attribute '__bases__' 

In [7]: foo(Thing) 
[<type 'object'>] 

In [8]: foo(Circle) 
[<class '__main__.Shape'>] 

In [9]: foo(Shape) 
[<class '__main__.Thing'>] 
+0

आह आप सभी को धन्यवाद। बहुत सराहना की। मुझे समझ में नहीं आया कि वस्तुओं के पास आधार नहीं थे –

2
print '\n'.join(base.__name__ for base in test.__class__.__bases__) 

या, inspect मॉड्यूल का उपयोग कर:

from inspect import getmro 
print '\n'.join(base.__name__ for base in getmro(test)) 
संबंधित मुद्दे