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à self
siê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 super
khô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 str
hoặc tuple
hoặ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 cls
mộ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 super
cũ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')