उपवर्ग के अधिरोहित कार्य करें


19

क्या पायथन में एक उपवर्ग के सभी ओवरराइड कार्यों को प्राप्त करने का एक तरीका है?

उदाहरण:

class A:
    def a1(self):
        pass

    def a2(self):
        pass


class B(A):
    def a2(self):
        pass

    def b1(self):
        pass

यहाँ, मैं ["a2"]कक्षा की एक वस्तु के Bलिए (या स्वयं वर्ग वस्तु के लिए) एक सूची प्राप्त करना चाहूंगा क्योंकि कक्षा Bकेवल एक ही विधि से अधिक होती है a2

जवाबों:


18

आप के साथ माता-पिता की कक्षाओं तक पहुँच सकते हैं, माता-पिता की cls.__bases__सभी विशेषताओं का पता लगा सकते हैं dir, और कक्षा की सभी विशेषताओं को अपने साथ एक्सेस कर सकते हैं vars:

def get_overridden_methods(cls):
    # collect all attributes inherited from parent classes
    parent_attrs = set()
    for base in cls.__bases__:
        parent_attrs.update(dir(base))

    # find all methods implemented in the class itself
    methods = {name for name, thing in vars(cls).items() if callable(thing)}

    # return the intersection of both
    return parent_attrs.intersection(methods)
>>> get_overridden_methods(B)
{'a2'}

varsमैं गायब था। (अविश्वसनीय रूप से) तेजी से उत्तर के लिए बड़ा धन्यवाद!
एंड्रियास शोर्गेनहुमर

parent_attrsएक लाइन में यदि आप चाहते हैं:parent_attrs = {a for b in cls.__bases__ for a in dir(b)}
wjandrea

3

आप __mro__टपल का उपयोग कर सकते हैं , जो विधि संकल्प क्रम रखता है।

अपने उदाहरण के लिए:

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

तो आप उस ट्यूपल पर लूप कर सकते हैं और जांच सकते हैं कि क्या एक Bविधि अन्य वर्गों में से एक में भी है।


इस विधि नहीं पूर्वनिर्धारित होगा बाहर करते हैं, किसी भी तरह दुंदर विधि,__init__, __eq__, ....... etc
Charif DZ

0
class A:

    def a1(self):
        pass

    def a2(self):
        pass


class B(A):

    def a2(self):
        super().a2()  
        pass

    def b1(self):
        pass
obj = B()

obj.a2()   # ***first give the output of parent class then child class***

1
मुझे लगता है कि आपने प्रश्न को गलत समझा। कक्षाएं Aऔर Bसंशोधित नहीं की जा सकतीं। ओपी यह जानना चाहता है कि कौन से Bतरीके किसी एक तरीके को ओवरराइड Aकरते हैं।
वेजेंड्रिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.