Để làm rõ Paul's answer, đây là một ví dụ đơn giản:
class Test(object):
print "Class being defined"
def __init__(self):
print "Instance being created"
for _ in range(3):
t = Test()
Kết quả từ này sẽ là:
Class being defined
Instance being created
Instance being created
Instance being created
Mã trong định nghĩa class
nhưng bên ngoài một inition phương pháp def
chạy chỉ một lần, khi lớp được xác định.
Nếu bạn muốn mã để chạy bất cứ khi nào một thể hiện được tạo ra, nó phải ở trong __init__
phương pháp dụ (hoặc, thỉnh thoảng, các __new__
lớp phương pháp). Tuy nhiên, lưu ý rằng nếu bạn xác định __init__
cho một lớp con, có lẽ bạn nên đảm bảo rằng nó cũng kêu gọi của lớp cha __init__
:
class AError(Exception):
def __init__(self, *args, **kwargs):
Exception.__init__(self, *args, **kwargs) # call the superclass
print 'error occur' # print your message
Điều này đảm bảo rằng lớp con hỗ trợ các đối số cho các lớp cha; trong trường hợp của Exception
, bạn có thể, ví dụ: vượt qua một thông báo lỗi:
>>> raise AError("Something went wrong.")
error occur # your message gets printed when the instance is created
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
raise AError("Something went wrong.")
AError: Something went wrong. # the error message passes through to the traceback
Để giải thích về cú pháp *args, **kwargs
, nếu bạn không quen thuộc với nó, xem ví dụ What does ** (double star) and * (star) do for parameters?. Bạn cũng có thể sử dụng super
để gọi các phương thức siêu lớp, xem ví dụ: Understanding Python super() with __init__() methods.
Câu trả lời này rất rõ ràng, tôi hiểu rồi. 3Q rất nhiều, vì vậy kand của bạn! –