2010-08-27 41 views
8

thể trùng lặp:
Python's use of __new__ and __init__ ?__new__ Overriding và __init__ bằng Python

Con đường tôi hiểu nó, __init__ là khác nhau từ một constructor trong Java, vì __init__ chỉ khởi tạo một đối tượng có đã được xây dựng hoàn toàn (vì __init__ được gọi sau __new__). Tuy nhiên, mọi thứ mà tôi đã từng cần để xác định đã sử dụng thuộc tính sau này của một 'hàm tạo' trong Java. Trường hợp lập trình viên sẽ muốn ghi đè __new__ là gì?

EDIT: Đối với hồ sơ, tôi hỏi một phần vì tôi đang tự hỏi điều gì sẽ là lợi thế/bất lợi đến trọng mới vs sử dụng một classmethod riêng biệt trong câu trả lời chấp nhận cho câu hỏi này:

Moving Beyond Factories in Python

+0

Không hoàn toàn trùng lặp chính xác trong mắt của tôi – abyx

Trả lời

11

__new__ thực sự xảy ra trước khi một đối tượng tồn tại. Đó là một phương pháp tĩnh của loại. Sử dụng của __new__ là khi bạn muốn kiểm soát việc tạo đối tượng mới, ví dụ: một singleton. Nếu __new__ của bạn luôn trả về cùng một thể hiện của một đối tượng, đó là một singleton. Bạn không thể làm điều đó với __init__.

Nói chung, trong "python như Guido dự định nó là" bạn không nên sử dụng __new__ hơn tháng một lần :)

+0

Điều đó có ý nghĩa. Vậy đây có phải là câu trả lời được chấp nhận bên dưới không, trường hợp ghi đè __new__ cũng sẽ phù hợp? http://stackoverflow.com/questions/3571773/moving-beyond-factories-in-python – chimeracoder

+0

@thebackhand trông giống như – abyx

3

__new__ là để tạo trường hợp đối tượng mới, __init__ là dành cho khởi tạo nó.

Tôi nghĩ nếu bạn thiết kế một loại không thay đổi, bạn phải khởi tạo nó trong __new__, xem namedtuple ví dụ (cũng Python's use of __new__ and __init__?).

Các vấn đề liên quan