Tại sao các constructor thực sự được gọi là "Constructors"?
Hàm tạo (được đặt tên __new__) tạo và trả về một thể hiện mới của lớp. Vì vậy, C.__new__phương thức lớp là phương thức khởi tạo cho lớp C.
Các C.__init__phương pháp dụ được gọi vào một trường hợp cụ thể, sau khi nó được tạo ra, để khởi nó trước khi được truyền lại cho người gọi. Vì vậy, phương thức đó là trình khởi tạo cho các phiên bản mới của C.
Chúng khác với các phương thức trong một lớp như thế nào?
Như đã nêu trong tài liệu chính thức __init__ được gọi sau khi phiên bản được tạo . Các phương pháp khác không nhận được điều trị này.
Mục đích của họ là gì?
Mục đích của hàm tạo C.__new__là xác định hành vi tùy chỉnh trong quá trình xây dựng một Ccá thể mới .
Mục đích của trình khởi tạo C.__init__là xác định khởi tạo tùy chỉnh của từng phiên bản Csau khi nó được tạo.
Ví dụ: Python cho phép bạn làm:
class Test(object):
pass
t = Test()
t.x = 10 # here you're building your object t
print t.x
Nhưng nếu bạn muốn mọi trường hợp Testcó thuộc tính xbằng 10, bạn có thể đặt mã đó bên trong __init__:
class Test(object):
def __init__(self):
self.x = 10
t = Test()
print t.x
Mọi phương thức thể hiện (một phương thức được gọi trên một thể hiện cụ thể của một lớp) nhận thể hiện làm đối số đầu tiên của nó. Đối số đó được đặt tên theo quy ước self.
Các phương thức lớp, chẳng hạn như hàm tạo __new__, thay vào đó nhận lớp làm đối số đầu tiên của chúng.
Bây giờ, nếu bạn muốn các giá trị tùy chỉnh cho xthuộc tính, tất cả những gì bạn phải làm là chuyển giá trị đó làm đối số cho __init__:
class Test(object):
def __init__(self, x):
self.x = x
t = Test(10)
print t.x
z = Test(20)
print t.x
Tôi hy vọng điều này sẽ giúp bạn xóa một số nghi ngờ, và vì bạn đã nhận được câu trả lời tốt cho các câu hỏi khác nên tôi sẽ dừng ở đây :)
__init__là một khởi tạo . Python constructor là__new__. Python sử dụng khởi tạo hai giai đoạn tự động -__new__trả về một đối tượng hợp lệ nhưng (thường là) không được phổ biến (xemboolví dụ về phản đối), đối tượng này sau đó đã__init__tự động gọi nó. Điều này tránh được các vấn đề mà các ngôn ngữ như C ++ gặp phải với các đối tượng được xây dựng một phần - bạn không bao giờ có một đối tượng trong Python (mặc dù nó có thể được khởi tạo một phần). Bạn sẽ hầu như không cần phải ghi đè cả hai__new__và__init__trên một lớp.