2016-11-10 15 views
6

Tôi đang đọc Hãy suy nghĩ về Python: Cách suy nghĩ giống như một nhà khoa học máy tính. Tác giả sử dụng “gọi” với các phương pháp và “gọi” với các chức năng.Có phải thông thường để nói rằng các hàm được gọi và các phương thức được gọi?

Đây có phải là quy ước không? Và, nếu vậy, tại sao sự khác biệt này lại được tạo ra? Tại sao các hàm được gọi là được gọi là nhưng các phương thức được gọi là được gọi là?

+0

Có liên quan, có thể trùng lặp (trong ngữ cảnh C#): [Sự khác biệt giữa "gọi" và "gọi" là gì?] (Http://stackoverflow.com/q/18505422/464709) –

+0

Theo kinh nghiệm của tôi với Python, Tôi sẽ nói rằng nó là phổ biến hơn nhiều để nói/nghe "gọi" cho cả hai phương pháp và chức năng, và tôi hiếm khi nghe nói "gọi" được sử dụng cho một trong hai. Tuy nhiên, việc đào tạo của tôi bằng Python là khá chính thức và bạn có thể có các quy ước khác nhau trong các lĩnh vực khác nhau. – elethan

+1

Tôi đã luôn phân biệt các hàm thứ tự đầu tiên luôn được gọi. Các phương thức của một lớp được gọi * trên lớp * –

Trả lời

2

Không thực sự, có thể là dễ dàng hơn để người đọc mới tạo sự khác biệt rõ ràng để hiểu rằng lời gọi của họ hơi khác. Ít nhất đó là lý do tại sao tôi nghi ngờ tác giả có thể đã chọn các từ ngữ khác nhau cho mỗi tác giả.

Dường như không có quy ước nào đưa ra điều này trong Hướng dẫn tham khảo cho ngôn ngữ Python. Những gì tôi có vẻ như họ đang làm là chọn gọi khi cuộc gọi được thực hiện cho một chức năng là ẩn ngụ và không rõ ràng.

Ví dụ, trong phần Callables của the Standard Type Hierarchy bạn thấy:

[..] Khi một đối tượng phương pháp dụ được gọi, chức năng cơ bản (__func__) được gọi, chèn dụ lớp (__self__) ở phía trước danh sách đối số. [...]

(tôi nhấn mạnh) Explicit gọi

Tiếp tục xuống trong Basic Customization và đặc biệt for __new__ bạn có thể thấy:

gọi để tạo ra một thể hiện mới của lớp cls. __new__() là phương pháp tĩnh [...]

(tôi nhấn mạnh) gọi Explicit

Trong khi chỉ một vài câu sau đó bạn sẽ thấy cách gọi được sử dụng vì __new__ ngầm gọi __init__:

Nếu __new__() không trả lại một thể hiện của cls, sau đó phương thức __init__() của cá thể mới sẽ không được gọi.

(tôi nhấn mạnh) mặc nhiên được gọi

Vì vậy, không, không ước dường như được sử dụng, ít nhất là bởi những người tạo ra ngôn ngữ. Đơn giản là tốt hơn phức tạp, tôi đoán :-).

+1

Tôi nên thêm điều đó vào Python, mọi cuộc gọi (ngoại trừ kiểu dữ liệu tích hợp, có lẽ) bao gồm tra cứu thuộc tính, vì vậy không có sự khác biệt nào ở cấp độ triển khai. –

1

Một nguồn tốt cho điều này sẽ là the Python documentation.Một tìm kiếm văn bản đơn giản thông qua phần trên Lớp học cho thấy từ "gọi" được sử dụng nhiều lần liên quan đến "phương thức gọi" và từ "gọi" chỉ được sử dụng một lần.

Theo kinh nghiệm của tôi, điều này cũng đúng: tôi thường xuyên nghe "cuộc gọi" được sử dụng để tham chiếu đến các phương pháp và chức năng, trong khi tôi hiếm khi nghe "gọi". Tuy nhiên, tôi cho rằng đây chủ yếu là vấn đề sở thích cá nhân và/hoặc ngữ cảnh (là thiết lập không chính thức ?, học tập ?, v.v.).

Bạn cũng sẽ thấy places in the documentation nơi từ "gọi" được sử dụng trong refernce chức năng:

trống Py_FatalError (const char * message)

In một thông báo lỗi gây tử vong và giết quá trình. Không dọn dẹp được thực hiện. Chức năng này chỉ cần gọi khi điều kiện được phát hiện sẽ làm cho nó nguy hiểm để tiếp tục sử dụng trình thông dịch Python; ví dụ: khi quản trị đối tượng dường như bị hỏng. Trên Unix, chức năng thư viện tiêu chuẩn C hủy bỏ() được gọi là sẽ cố gắng tạo ra tệp lõi .

Và từ here:

trống Py_DECREF (PyObject * o)

Decrement tính tham chiếu cho đối tượng o. Đối tượng không được là NULL; nếu bạn không chắc chắn rằng đó không phải là NULL, thì hãy sử dụng số Py_XDECREF(). Nếu số tham chiếu bằng không, hàm của đối tượng của đối tượng (không được NULL) được gọi.

Mặc dù cả hai tham chiếu này đều từ API C C, do đó có thể đáng kể.

Để summerize:

Tôi nghĩ rằng nó là an toàn để sử dụng hoặc "gọi" hoặc "gọi" trong bối cảnh của các chức năng hoặc các phương pháp mà không nghe, hoặc như một Noob hay một showoff.

Lưu ý rằng Tôi chỉ nói về Python và những gì tôi biết từ trải nghiệm của riêng mình. Tôi không thể nói chuyện với sự khác biệt giữa các thuật ngữ này bằng các ngôn ngữ khác.

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