2009-04-09 43 views
58

Vì đây nói:Chức năng quá tải bằng Python: Thiếu

http://web.archive.org/web/20090624083829/http://mail.python.org/pipermail/python-list/2003-May/206149.html

Tái định nghĩa hàm vắng mặt trong Python.

Theo như tôi cảm thấy đây là một khuyết tật lớn vì nó cũng là một ngôn ngữ OO. Ban đầu tôi thấy rằng không thể phân biệt giữa các loại đối số là khó nhưng bản chất động của Python đã làm cho nó dễ dàng (ví dụ: danh sách, bộ dữ liệu, các chuỗi tương tự nhau).

Tuy nhiên, đếm số lượng đối số được chuyển và sau đó thực hiện công việc giống như quá mức cần thiết.

+3

Vì vậy? Bạn nghĩ gì bạn cần quá tải? – kquinn

+2

Bỏ phiếu để đóng không phải là một câu hỏi thực sự. Đó không phải là để nói rằng nó không phải là một điểm có khả năng hợp lệ, nhưng nó không phải là một câu hỏi. –

+0

Vâng, sau đó sử dụng một ngôn ngữ cung cấp quá tải ... –

Trả lời

31

Như thư giãn lưu ý, đối số từ khóa với các giá trị mặc định có thể đi một chặng đường dài.

Tôi cũng sẽ nói rằng theo ý kiến ​​của tôi, nó đi ngược lại tinh thần của Python để lo lắng rất nhiều về những loại được chuyển vào phương pháp. Trong Python, tôi nghĩ rằng nó được chấp nhận hơn để sử dụng gõ vịt - hỏi những gì một đối tượng có thể làm, chứ không phải là những gì nó được.

Vì vậy, nếu phương pháp của bạn có thể chấp nhận một chuỗi hoặc một tuple, bạn có thể làm điều gì đó như thế này:

def print_names(names): 
    """Takes a space-delimited string or an iterable""" 
    try: 
     for name in names.split(): # string case 
      print name 
    except AttributeError: 
     for name in names: 
      print name 

Sau đó, bạn có thể làm một trong những:

print_names("Ryan Billy") 
print_names(("Ryan", "Billy")) 

Mặc dù một API như đôi khi chỉ ra một vấn đề thiết kế.

+36

Sau đó, ví dụ không có vấn đề về thiết kế, xin vui lòng. – accuya

+1

Cấp, nó có một chút contrived, nhưng điều này tổng hợp một danh sách int/str và xem xét '[a-z]/i' để có giá trị 1-26: https://gist.github.com/cmattoon/abeed5fb8367b0b869cf –

6

Thông thường bạn thấy đề xuất sử dụng các đối số từ khóa, với các giá trị mặc định, thay vào đó. Nhìn kìa.

22

bạn không cần quá tải hàm, vì bạn có đối số * args và ** kwargs.

Thực tế là quá tải hàm được dựa trên ý tưởng chuyển các loại khác nhau, bạn sẽ thực thi mã khác nhau. Nếu bạn có một ngôn ngữ được gõ động như python, bạn không nên phân biệt theo kiểu, nhưng bạn nên xử lý các giao diện và sự tuân thủ của chúng với mã bạn viết. Ví dụ, nếu bạn có mã có thể xử lý một số nguyên hoặc danh sách các số nguyên, bạn có thể thử lặp lại trên nó và nếu bạn không thể, thì bạn cho rằng đó là số nguyên và tiếp tục. Tất nhiên nó có thể là một phao, nhưng theo như hành vi được quan tâm, nếu một phao và một int xuất hiện là như nhau, sau đó chúng có thể được hoán đổi cho nhau.

+6

Quá tải không nghiêm chỉnh về các loại, nó cũng về số lượng đối số. Ví dụ, tôi có thể muốn accessor và mutator của tôi (hoặc "getter" và "setter" nếu bạn thích) chia sẻ một tên phương thức duy nhất, nhưng rõ ràng họ đang làm những điều riêng biệt dựa trên sự hiện diện của một đối số. Điều này không liên quan gì tới loại đối số. – Nerdmaster

6

Bạn có thể chuyển một kiểu dữ liệu vùng chứa có thể thay đổi thành một hàm, nó có thể chứa bất cứ thứ gì bạn muốn.

Nếu bạn cần một chức năng khác, hãy đặt tên cho các hàm khác nhau hoặc nếu U cần một giao diện tương tự, chỉ cần viết hàm giao diện (hoặc phương thức) gọi các hàm đó một cách thích hợp dựa trên dữ liệu nhận được.

Phải mất một thời gian để tôi để được điều chỉnh để này đến từ Java, Nhưng nó thực sự isnt một "khuyết tật lớn"

37

Bây giờ, trừ khi bạn đang cố gắng để viết mã C++ sử dụng cú pháp Python, những gì bạn sẽ cần quá tải cho?

Tôi nghĩ điều đó hoàn toàn ngược lại, quá tải chỉ cần thiết để làm cho các ngôn ngữ gõ mạnh mẽ hoạt động giống như Python. Trong Python bạn có đối số từ khóa, bạn có *args**kwargs.

Xem ví dụ: What is a clean, pythonic way to have multiple constructors in Python?

+54

Đánh giá của bạn rằng quá tải là _ "hack-work cho ngôn ngữ khuyết tật" _ dường như bị phân cực quá mức và xem xét lợi ích của việc gõ tĩnh, và sự phù hợp của nó với một kiểu triển khai khác. [Câu trả lời của Stefano Borini] (http://stackoverflow.com/a/733385/322333) rằng _ ".. quá tải hàm được dựa trên ý tưởng truyền các kiểu khác nhau, bạn sẽ thực thi mã khác nhau. Nếu bạn có một ngôn ngữ được gõ động như python, bạn không nên phân biệt theo loại "_ là nhiều thông tin và hữu ích tôi nghĩ. – boycy

+8

Tất nhiên, bạn cũng có thể sử dụng các đối số biến trong C++, nhưng quá tải được sử dụng để giữ mã * clean *. Như trong, một hàm thực hiện một điều thay vì có một hàm đơn lẻ với các câu lệnh cố gắng tìm ra những gì cần làm dựa trên những gì được truyền vào. – Nerdmaster