সাবক্লাসের ওভাররাইড ফাংশনগুলি পান


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আমি যে জিনিসটি মিস করছি তা ছিল। (অবিশ্বাস্য) দ্রুত উত্তরের জন্য বড় ধন্যবাদ!
— Andreas Schörgenhumer

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
— ডিজেড

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করে?
— wjandrea
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.