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.

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'}

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.


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***

1
Saya pikir Anda salah paham pertanyaannya. Kelas Adan Btidak dapat dimodifikasi. OP ingin mengetahui Bmetode mana yang menggantikan salah satu Ametode itu.
— wjandrea
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.