Dapatkan fungsi subclass yang diganti

19

Apakah ada cara untuk mendapatkan semua fungsi subclass di Python?

Contoh:

class A:
    def a1(self):
        pass

    def a2(self):
        pass


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

    def b1(self):
        pass

Di sini, saya ingin mendapatkan daftar ["a2"]untuk objek kelas B(atau untuk objek kelas itu sendiri) karena kelas Bhanya menimpa metode tunggal, yaitu a2.

Andreas Schörgenhumer
sumber

Jawaban:

18

Anda dapat mengakses kelas induk dengan cls.__bases__, menemukan semua atribut orangtua dir, dan mengakses semua atribut dari kelas itu sendiri dengan 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'}
Aran-Fey
sumber
varsadalah hal yang saya lewatkan. terima kasih banyak atas jawaban (luar biasa) yang cepat!
Andreas Schörgenhumer
parent_attrsdalam satu baris jika Anda mau:parent_attrs = {a for b in cls.__bases__ for a in dir(b)}
wjandrea
3

Anda dapat menggunakan __mro__tuple, yang menampung urutan resolusi metode.

Sebagai contoh Anda:

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

Jadi Anda bisa mengulang tuple itu dan memeriksa apakah suatu Bmetode juga ada di salah satu kelas lainnya.

Adelin
sumber
Ini tidak akan mengecualikan metode yang telah ditentukan, seperti metode dunder ,__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***
Manish Sharma
sumber
1
Saya pikir Anda salah paham pertanyaannya. Kelas Adan Btidak dapat dimodifikasi. OP ingin mengetahui Bmetode mana yang menggantikan salah satu Ametode itu.
wjandrea