Alt sınıfın geçersiz kılınmış işlevlerini alma


19

Python'da bir alt sınıfın tüm geçersiz kılma işlevlerini almanın bir yolu var mı?

Misal:

class A:
    def a1(self):
        pass

    def a2(self):
        pass


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

    def b1(self):
        pass

Burada, bir liste istiyorum ["a2"]sınıfının bir nesne için B(ya da sınıf nesnesinin kendisi için) sınıfı yana Bgeçersiz kılma tek bir yöntem, yani a2.

Yanıtlar:


18

İle ana sınıflara erişebilir, ebeveynlerin cls.__bases__tüm niteliklerini bulabilir ve sınıfın tüm niteliklerine aşağıdakilerle direrişebilirsiniz 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'}

varseksik olduğum şeydi. (inanılmaz) hızlı cevap için büyük teşekkürler!
Andreas Schörgenhumer

parent_attrsisterseniz bir satırda:parent_attrs = {a for b in cls.__bases__ for a in dir(b)}
wjandrea

3

Sen yararlanabilir __mro__yöntem çözünürlük sırası tutan tuple.

Örneğiniz için:

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

Böylece bu demet üzerinde döngü yapabilir ve bir Byöntemin diğer sınıflardan birinde olup olmadığını kontrol edebilirsiniz .


Bu, herhangi bir dunder yöntemi gibi önceden tanımlanmış yöntemi hariç tutmayacaktır ,__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
Bence soruyu yanlış anladın. Sınıflar Ave Bdeğiştirilemez. OP, hangi Byöntemlerden birinin yöntemlerinden birini geçersiz kıldığını bilmek ister A.
wjandrea
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.