Uzyskaj zastąpione funkcje podklasy


19

Czy istnieje sposób na uzyskanie wszystkich nadpisanych funkcji podklasy w Pythonie?

Przykład:

class A:
    def a1(self):
        pass

    def a2(self):
        pass


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

    def b1(self):
        pass

W tym miejscu chciałbym uzyskać listę ["a2"]dla obiektu klasy B(lub samego obiektu klasy), ponieważ klasa Bzastępuje tylko jedną metodę, a mianowicie a2.

Odpowiedzi:


18

Możesz uzyskać dostęp do klas nadrzędnych za pomocą cls.__bases__, znaleźć wszystkie atrybuty rodziców za pomocą diri uzyskać dostęp do wszystkich atrybutów samej klasy za pomocą 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'}

varsbyło to, czego mi brakowało. wielkie dzięki za (niewiarygodnie) szybką odpowiedź!
Andreas Schörgenhumer

parent_attrsw jednej linii, jeśli chcesz:parent_attrs = {a for b in cls.__bases__ for a in dir(b)}
wjandrea

3

Możesz skorzystać z __mro__krotki, która utrzymuje kolejność rozdzielczości metody.

Na przykład:

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

Możesz więc zapętlić tę krotkę i sprawdzić, czy Bmetoda należy również do jednej z pozostałych klas.


Nie wyklucza to predefiniowanej metody, jak każdej metody dundera ,__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
Myślę, że źle zrozumiałeś pytanie. Klasy Ai Bnie można ich modyfikować. OP chce wiedzieć, która z Bmetod zastępuje jedną z Ametod.
wjandrea
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.