Nhận các chức năng bị ghi đè của lớp con


19

Có cách nào để có được tất cả các hàm overriden của một lớp con trong Python không?

Thí dụ:

class A:
    def a1(self):
        pass

    def a2(self):
        pass


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

    def b1(self):
        pass

Ở đây, tôi muốn có một danh sách ["a2"]cho một đối tượng của lớp B(hoặc cho chính đối tượng lớp) vì lớp Bchỉ ghi đè một phương thức duy nhất, cụ thể là a2.

Câu trả lời:


18

Bạn có thể truy cập các lớp cha với cls.__bases__, tìm tất cả các thuộc tính của cha mẹ dirvà truy cập tất cả các thuộc tính của chính lớp đó bằng 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'}

varslà thứ tôi đã bỏ lỡ. cảm ơn rất nhiều vì câu trả lời nhanh chóng
Andreas Schörgenhumer

parent_attrstrong một dòng nếu bạn muốn:parent_attrs = {a for b in cls.__bases__ for a in dir(b)}
wjandrea

3

Bạn có thể sử dụng __mro__bộ dữ liệu giữ thứ tự độ phân giải phương thức.

Ví dụ của bạn:

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

Vì vậy, bạn có thể lặp qua bộ dữ liệu đó và kiểm tra xem một Bphương thức cũng thuộc một trong các lớp khác.


Điều này sẽ không loại trừ phương thức được xác định trước, giống như bất kỳ phương pháp dunder nào ,__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
Tôi nghĩ rằng bạn đã hiểu nhầm câu hỏi. Các lớp học ABkhông thể được sửa đổi. OP muốn biết Bphương thức nào ghi đè lên một trong Acác phương thức.
wjandrea
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.