서브 클래스의 재정의 된 함수 얻기


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메소드가 다른 클래스 중 하나에 있는지 확인할 수 있습니다.


이것은 어떤 dunder 방법 처럼 미리 정의 된 방법을 배제하지 않을 것입니다__init__, __eq__, ....... etc
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
나는 당신이 그 질문을 오해했다고 생각합니다. 수업 AB수정할 수 없습니다. OP는 B의 방법 중 하나를 재정의하는 방법 을 알고 싶어 A합니다.
wjandrea
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.