Xem xét điều này - một lớp cơ sở A, lớp B kế thừa từ A, lớp C kế thừa từ B. Cách tổng quát để gọi hàm tạo lớp cha trong một hàm tạo là gì? Nếu điều này vẫn còn quá mơ hồ, đây là một số mã.Trình xây dựng cha mẹ gọi chuỗi trong python
class A(object):
def __init__(self):
print "Constructor A was called"
class B(A):
def __init__(self):
super(B,self).__init__()
print "Constructor B was called"
class C(B):
def __init__(self):
super(C,self).__init__()
print "Constructor C was called"
c = C()
Đây là cách tôi làm ngay bây giờ. Nhưng nó vẫn có vẻ hơi quá chung chung - bạn vẫn phải vượt qua một loại chính xác bằng tay. Bây giờ, tôi đã thử sử dụng self.__class__
làm đối số đầu tiên cho siêu(), nhưng, rõ ràng là nó không hoạt động - nếu bạn đặt nó trong hàm tạo cho C - đủ công bằng, hàm tạo của B được gọi. Nếu bạn làm như vậy trong B, "self" vẫn trỏ đến một thể hiện của C để bạn kết thúc gọi hàm khởi tạo của B một lần nữa (điều này kết thúc bằng một đệ quy vô hạn).
Không cần phải suy nghĩ về kế thừa kim cương cho bây giờ, tôi chỉ quan tâm đến việc giải quyết vấn đề cụ thể này.
"Nhưng nó vẫn có vẻ hơi quá phi generic - bạn vẫn phải vượt qua một loại chính xác bằng tay. "?? Bạn đang chuyển tên lớp thành super(). Bạn không bao giờ cần biết siêu lớp hay bất cứ thứ gì khác. Làm thế nào là không chung chung này? Nó tạo ra vấn đề gì? Bạn có thể đưa ra một ví dụ trong đó điều này bị phá vỡ không? –
Tôi chưa sẵn sàng trả lời câu hỏi này nếu đầy đủ. Nhưng dù sao thì, nếu lớp học được đổi tên thì sao? Điều gì sẽ xảy ra nếu tôi muốn viết một hàm trang trí để tự động hóa kiểu chuỗi này? Bây giờ tôi thấy, rằng điều này là không thể, nhưng tại thời điểm đặt câu hỏi tôi không biết điều đó. – shylent