Tôi đã đọc Lập trình Python chuyên gia có ví dụ về đa kế thừa. Tác giả cuốn sách đã giải thích nhưng tôi không hiểu nó, vì vậy tôi muốn có một cái nhìn khác.Một đối tượng được tạo hai lần trong Python
Ví dụ cho thấy đối tượng B
được tạo hai lần!
Xin vui lòng cho tôi một lời giải thích trực quan.
In [1]: class A(object):
...: def __init__(self):
...: print "A"
...: super(A, self).__init__()
In [2]: class B(object):
...: def __init__(self):
...: print "B"
...: super(B, self).__init__()
In [3]: class C(A,B):
...: def __init__(self):
...: print "C"
...: A.__init__(self)
...: B.__init__(self)
In [4]: print "MRO:", [x.__name__ for x in C.__mro__]
MRO: ['C', 'A', 'B', 'object']
In [5]: C()
C
A
B
B
Out[5]: <__main__.C at 0x3efceb8>
Tác giả cuốn sách cho biết:
Điều này xảy ra do sự
A.__init__(self)
cuộc gọi, được thực hiện với sự dụ C, do đó làm chosuper(A, self).__init__()
gọiB
's constructor
Các mà từ đó tôi không hiểu ý tưởng của mình là cách gọi A.__init__(self)
sẽ thực hiện super(A, self).__init__()
gọi hàm tạo B
Tại sao bạn không sử dụng 'siêu phương thức init của 'in C '? –
Tôi chỉ muốn hiểu một đối tượng được tạo ra bằng Python như thế nào. – Bryan
Nếu bạn nghĩ về lệnh gọi 'super' có nghĩa là 'gọi phương thức tiếp theo trong MRO', thay vì 'gọi phương thức của lớp cha mẹ', thì hành vi này sẽ có ý nghĩa hơn. Trong trường hợp này, lý do bạn thấy B được in hai lần là vì siêu sắp xếp cho init của B được gọi (bởi init của A), và vì vậy khi bạn gọi B.init từ C, bạn sẽ nhận được cuộc gọi thứ hai. –