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


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.