Làm cách nào để khởi tạo lớp cơ sở (siêu)?
class SuperClass(object):
def __init__(self, x):
self.x = x
class SubClass(SuperClass):
def __init__(self, y):
self.y = y
Sử dụng một superđối tượng để đảm bảo bạn nhận được phương thức tiếp theo (dưới dạng phương thức bị ràng buộc) theo thứ tự phân giải phương thức. Trong Python 2, bạn cần chuyển tên lớp và selfsiêu để tra cứu __init__phương thức liên kết :
class SubClass(SuperClass):
def __init__(self, y):
super(SubClass, self).__init__('x')
self.y = y
Trong Python 3, có một chút ma thuật làm cho các đối số trở nên superkhông cần thiết - và như một lợi ích phụ, nó hoạt động nhanh hơn một chút:
class SubClass(SuperClass):
def __init__(self, y):
super().__init__('x')
self.y = y
Mã cứng gốc như thế này dưới đây ngăn bạn sử dụng đa kế thừa hợp tác:
class SubClass(SuperClass):
def __init__(self, y):
SuperClass.__init__(self, 'x') # don't do this
self.y = y
Lưu ý rằng __init__chỉ có thể quay trở lạiNone - nó nhằm mục đích sửa đổi đối tượng tại chỗ.
Cái gì đó __new__
Có một cách khác để khởi tạo các thể hiện - và đó là cách duy nhất cho các lớp con của các kiểu bất biến trong Python. Vì vậy, nó là bắt buộc nếu bạn muốn phân lớp con strhoặc tuplehoặc một đối tượng bất biến khác.
Bạn có thể nghĩ đó là một phương pháp phân lớp vì nó nhận được một đối số lớp ngầm. Nhưng nó thực sự là một staticmethod . Vì vậy, bạn cần phải gọi __new__với clsmột cách rõ ràng.
Chúng tôi thường trả về trường hợp từ __new__, vì vậy nếu bạn làm vậy, bạn cũng cần gọi cơ sở của mình __new__qua supercũng như trong lớp cơ sở của bạn. Vì vậy, nếu bạn sử dụng cả hai phương pháp:
class SuperClass(object):
def __new__(cls, x):
return super(SuperClass, cls).__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super(SubClass, cls).__new__(cls)
def __init__(self, y):
self.y = y
super(SubClass, self).__init__('x')
Python 3 vượt qua một chút sự kỳ lạ của các lệnh gọi siêu gây ra bởi __new__là một phương thức tĩnh, nhưng bạn vẫn cần chuyển clsđến __new__phương thức không bị ràng buộc :
class SuperClass(object):
def __new__(cls, x):
return super().__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super().__new__(cls)
def __init__(self, y):
self.y = y
super().__init__('x')