2012-04-10 21 views
29
class A(object): 
    def get_class(self): 
     return self.__class__ 

class B(A): 
    def __init__(self): 
     A.__init__(self) 

b = B() 
print b.get_class() 

यह कोड <class '__main__.B'> प्रिंट करेगा।पैरेंट क्लास नाम प्राप्त करें?

मुझे कक्षा का नाम कैसे प्राप्त किया जा सकता है जहां विधि परिभाषित की गई है (अर्थात् A)?

+2

आप http://stackoverflow.com/questions/961048/get-class-that-defined-method-in-python – okm

उत्तर

45

: https://docs.python.org/2/reference/datamodel.html#the-standard-type-hierarchy

कक्षा वस्तुओं एक __name__ विशेषता है। यह व्युत्पन्न वर्ग के __bases__ एटीआर के माध्यम से बेस क्लास (एसएस) को आत्मनिरीक्षण करने के लिए क्लीनर हो सकता है (यदि कोड व्युत्पन्न कक्षा में उदाहरण के लिए रहता है)।

>>> class Base(object): 
...  pass 
... 
>>> class Derived(Base): 
...  def print_base(self): 
...   for base in self.__class__.__bases__: 
...    print base.__name__ 
... 
>>> foo = Derived() 
>>> foo.print_base() 
Base 
-3

आप प्रलेखन से

return self.__class__ 

return A().__class__ 

को बदल सकता है के बाद से वहाँ एक का कोई अन्य उदाहरण() उपलब्ध है ...

+6

क्यों जांचने के लिए बेहतर है, क्यों न केवल 'वापस लौटें'? इसके लिए –

27

inspect.getmro(cls)

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

import inspect 
inspect.getmro(B) 

परिणाम होगा:

(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>) 

पहले तत्व वर्ग ही है, दूसरा तत्व हमेशा माता-पिता की पहली है। उसके बाद चीजें थोड़ा और जटिल हो सकती हैं।

+4

+1, ['mro()'] (http://docs.python.org/library/stdtypes.html?highlight=mro#class.__mro__) भी उपयोगी है – okm

+0

एमआरओ विधि समाधान आदेश है। यहां जांचें उदा। https://stackoverflow.com/questions/1848474/method-resolution-order-mro-in-new-style-classes – Chris

संबंधित मुद्दे