Tôi đang chạy Python 2.5, vì vậy câu hỏi này có thể không áp dụng cho Python 3. Khi bạn thực hiện phân cấp lớp kim cương bằng cách sử dụng đa thừa kế và tạo đối tượng của lớp được thừa hưởng nhất, Python thực hiện Điều Đúng (TM). Nó gọi hàm tạo cho lớp có xuất phát nhiều nhất, sau đó các lớp cha của nó được liệt kê từ trái sang phải, sau đó là ông bà. Tôi đã quen với Python MRO; đó không phải là câu hỏi của tôi. Tôi tò mò làm thế nào đối tượng trở về từ siêu thực sự quản lý để giao tiếp với các cuộc gọi của siêu trong các lớp học cha mẹ đúng thứ tự. Hãy xem xét mã ví dụ này:Làm thế nào để "siêu" của Python làm điều đúng?
#!/usr/bin/python
class A(object):
def __init__(self): print "A init"
class B(A):
def __init__(self):
print "B init"
super(B, self).__init__()
class C(A):
def __init__(self):
print "C init"
super(C, self).__init__()
class D(B, C):
def __init__(self):
print "D init"
super(D, self).__init__()
x = D()
Mã này không điều trực quan, nó in:
D init
B init
C init
A init
Tuy nhiên, nếu bạn nhận xét ra các cuộc gọi đến siêu trong hàm init B, không phải A hoặc hàm init C được gọi là. Điều này có nghĩa là lời gọi của B đến siêu là bằng cách nào đó nhận thức được sự tồn tại của C trong hệ thống phân cấp lớp tổng thể. Tôi biết rằng siêu trả về một đối tượng proxy với toán tử get overloaded, nhưng đối tượng được trả về bởi siêu trong định nghĩa init của D truyền đạt sự tồn tại của C tới đối tượng được trả về bởi siêu trong định nghĩa init của B? Có phải thông tin mà các cuộc gọi siêu sử dụng tiếp theo được lưu trữ trên chính đối tượng đó không? Nếu vậy, tại sao không phải là siêu thay vì self.super?
Chỉnh sửa: Jekke hoàn toàn đúng chỉ ra rằng nó không phải self.super vì siêu là một thuộc tính của lớp, không phải là một thể hiện của lớp. Khái niệm này có ý nghĩa, nhưng trong thực tế siêu không phải là một thuộc tính của lớp học! Bạn có thể kiểm tra điều này trong trình thông dịch bằng cách tạo hai lớp A và B, trong đó B kế thừa từ A và gọi dir(B)
. Nó không có thuộc tính super
hoặc __super__
.
Siêu không phải là self.super vì siêu là thuộc tính của lớp, không phải là cá thể. (Tôi thực sự không hiểu phần còn lại của câu hỏi.) –
Không liên quan, có thể; nhưng tôi đã được khuyên bởi nhiều người không sử dụng Python 2.5 nữa, vì Python 3 giới thiệu rất nhiều tính năng mới/sửa lỗi rất nhiều lỗi. – adam
Chỉnh sửa thành 'đối tượng được trả về bởi siêu định nghĩa init của D truyền đạt sự tồn tại của C tới đối tượng được trả về bởi siêu trong định nghĩa init của B'? Tôi tin rằng đó là những gì bạn đang yêu cầu - nó có thể có ý nghĩa hơn :) –