Người ta có thể xem Python đang làm gì ở đây, nhưng cách ghi đè là cực kỳ khắc nghiệt. Lấy trường hợp khi lớp A định nghĩa 100 thuộc tính và lớp B kế thừa các thuộc tính này và thêm 1 thuộc tính nữa. Chúng ta muốn có __init __() cho B gọi __init __() cho A và để mã B chỉ xác định thuộc tính duy nhất của nó. Tương tự, nếu chúng ta định nghĩa một phương thức reset() trong A để đặt tất cả các thuộc tính về 0, thì phương thức reset() tương ứng cho B sẽ có thể gọi phương thức reset() cho A và sau đó không sử dụng thuộc tính B phải sao chép tất cả mã của A. Python đang làm khó khăn những gì được cho là một lợi thế lớn của lập trình hướng đối tượng; đó là, việc tái sử dụng mã. Tùy chọn tốt nhất ở đây là tránh ghi đè các phương thức mà chúng tôi thực sự muốn sử dụng lại. Nếu bạn muốn nhận được một cảm giác trong những biến chứng với Python đây, hãy thử mã này:
class X(object):
def __init__ (self):
print "X"
self.x = 'x'
self.reset()
print "back to X"
def reset (self):
print "reset X"
self.xx = 'xx'
class Y(X):
def __init__ (self):
print "Y"
super(Y,self).__init__()
self.y = 'y'
self.reset()
print "back to Y"
def reset (self):
print "reset Y"
super(Y,self).reset()
print "back to reset Y"
self.yy = 'yy'
aY = Y()
(Để thực hiện công việc này đúng cách, loại bỏ các self.reset() gọi trong __init __() cho lớp Y.)
Nguồn
2013-04-12 19:49:26
Về cơ bản, bạn đang yêu cầu Python bỏ đi tính năng động và các phương thức ảo và * bằng cách nào đó * tìm ra để bỏ qua các phần của chuỗi tra cứu thuộc tính dựa vào vị trí mà một hàm được định nghĩa từ từ. Sẽ không xảy ra. – delnan