Hướng dẫn super __init__ in python - ở trên __init__ trong python

tôi đang cố để hiểu super[]

Lý do chúng tôi sử dụng

        super[ChildB, self].__init__[]
4là để các lớp con có thể đang sử dụng nhiều kế thừa hợp tác sẽ gọi hàm hàm cha mẹ tiếp theo chính xác trong Thứ tự phân giải phương thức [MRO].
        super[ChildB, self].__init__[]
4là để các lớp con có thể đang sử dụng nhiều kế thừa hợp tác sẽ gọi hàm hàm cha mẹ tiếp theo chính xác trong Thứ tự phân giải phương thức [MRO].

Nội dung chính

  • tôi đang cố để hiểu super[]
  • "Có gì khác biệt thực sự trong mã này?:"
  • Nếu Python không có super
  • Những lời phê bình về những câu trả lời khác:
  • Phê bình cho một câu trả lời khác

Trong Python 3, chúng ta có thể gọi nó như thế này:

class ChildB[Base]:
    def __init__[self]:
        super[].__init__[] 

Trong Python 2, chúng tôi được yêu cầu sử dụng nó như thế này:

        super[ChildB, self].__init__[]

Không có siêu, bạn bị hạn chế về khả năng sử dụng nhiều kế thừa:

        Base.__init__[self] # Avoid this.

Tôi giải thích thêm dưới đây.

"Có gì khác biệt thực sự trong mã này?:"

class ChildA[Base]:
    def __init__[self]:
        Base.__init__[self]

class ChildB[Base]:
    def __init__[self]:
        super[ChildB, self].__init__[]
        # super[].__init__[] # you can call super like this in Python 3!

Nếu Python không có super

        super[ChildB, self].__init__[]
5với
        super[ChildB, self].__init__[]
4, trong đó sử dụng các lớp hiện tại để xác định các lớp tiếp theo của
        super[ChildB, self].__init__[]
5để tìm kiếm trong MRO.

Những lời phê bình về những câu trả lời khác:câu hỏi chính tắc, Làm thế nào để sử dụng 'siêu' trong Python? , trong đó thể hiện tiêm phụ thuộchợp tác nhiều thừa kế .

Nếu Python không có super

Những lời phê bình về những câu trả lời khác:

        super[ChildB, self].__init__[]
4[cách nó được triển khai trong C, trừ một số hành vi kiểm tra và dự phòng và được dịch sang Python]:

class ChildB[Base]:
    def __init__[self]:
        mro = type[self].mro[]             # Get the Method Resolution Order.
        check_next = mro.index[ChildB] + 1 # Start looking after *this* class.
        while check_next >> UserA[]
UserA init'ed
ChildA init'ed
Base init'ed

Tôi minh họa sự khác biệt này trong một câu trả lời tại câu hỏi chính tắc, Làm thế nào để sử dụng 'siêu' trong Python? , trong đó thể hiện tiêm phụ thuộc và hợp tác nhiều thừa kế .

        Base.__init__[self] # Avoid this.
6, vì
        Base.__init__[self] # Avoid this.
3sử dụng
        super[ChildB, self].__init__[]
4, nên!:

        super[ChildB, self].__init__[]
0

Phê bình cho một câu trả lời khác

Trong Python 3, chúng ta có thể gọi nó như thế này:

        super[ChildB, self].__init__[]
1

Trong Python 2, chúng tôi được yêu cầu sử dụng nó như thế này:

Không có siêu, bạn bị hạn chế về khả năng sử dụng nhiều kế thừa:

        super[ChildB, self].__init__[]
2

Tôi giải thích thêm dưới đây.hoàn toàn sai.

        super[ChildB, self].__init__[]
4chúng ta hãy tìm kiếm phụ huynh tiếp theo trong MRO [xem phần đầu tiên của câu trả lời này] cho các lớp con. Nếu bạn nói rằng
        super[ChildB, self].__init__[]
4chúng ta đang ở trong phương thức của cá thể con, thì nó sẽ tìm kiếm phương thức tiếp theo trong dòng [có thể là phương thức này] dẫn đến đệ quy, có thể gây ra lỗi logic [trong ví dụ của người trả lời] hoặc
class ChildA[Base]:
    def __init__[self]:
        Base.__init__[self]

class ChildB[Base]:
    def __init__[self]:
        super[ChildB, self].__init__[]
        # super[].__init__[] # you can call super like this in Python 3!
1khi độ sâu đệ quy là vượt quá.

        super[ChildB, self].__init__[]
3

Sự khác biệt chính trong mã này là bạn có được một lớp về mình trong

        super[ChildB, self].__init__[]
5với
        super[ChildB, self].__init__[]
4, trong đó sử dụng các lớp hiện tại để xác định các lớp tiếp theo của
        super[ChildB, self].__init__[]
5để tìm kiếm trong MRO. 5 bình luận chia sẻ

Bài Viết Liên Quan

Chủ Đề