Tôi biết rằng Python không hỗ trợ quá tải phương thức, nhưng tôi đã gặp phải một vấn đề mà dường như tôi không thể giải quyết theo cách tốt đẹp của Pythonic.
Tôi đang làm một trò chơi trong đó một nhân vật cần phải bắn nhiều loại đạn khác nhau, nhưng làm thế nào để tôi viết các chức năng khác nhau để tạo ra những viên đạn này? Ví dụ, giả sử tôi có một chức năng tạo ra một viên đạn đi từ điểm A đến B với một tốc độ nhất định. Tôi sẽ viết một chức năng như thế này:
def add_bullet(sprite, start, headto, speed):
... Code ...
Nhưng tôi muốn viết các chức năng khác để tạo đạn như:
def add_bullet(sprite, start, direction, speed):
def add_bullet(sprite, start, headto, spead, acceleration):
def add_bullet(sprite, script): # For bullets that are controlled by a script
def add_bullet(sprite, curve, speed): # for bullets with curved paths
... And so on ...
Và như vậy với nhiều biến thể. Có cách nào tốt hơn để làm điều đó mà không sử dụng quá nhiều đối số từ khóa khiến nó trở nên xấu đi nhanh chóng. Đổi tên mỗi chức năng là xấu đẹp quá bởi vì bạn sẽ có được một trong hai add_bullet1
, add_bullet2
hoặc add_bullet_with_really_long_name
.
Để giải quyết một số câu trả lời:
Không, tôi không thể tạo cấu trúc phân cấp lớp Bullet vì quá chậm. Mã thực tế để quản lý đạn nằm trong C và các chức năng của tôi là các hàm bao quanh C API.
Tôi biết về các đối số từ khóa nhưng việc kiểm tra tất cả các loại kết hợp tham số đang gây khó chịu, nhưng các đối số mặc định giúp phân bổ như
acceleration=0
default value + if + else
để làm giống như C ++. Đây là một trong số rất ít thứ mà C ++ có khả năng đọc tốt hơn Python ...
script, curve
này là gì, chúng có tổ tiên chung không, chúng hỗ trợ phương pháp nào. Với kiểu gõ vịt, tùy thuộc vào thiết kế lớp của bạn để tìm ra phương pháp nào họ cần hỗ trợ. Có lẽ Script
hỗ trợ một số loại gọi lại dựa trên dấu thời gian (nhưng đối tượng nào sẽ trả về? Vị trí tại dấu thời gian đó? Quỹ đạo tại dấu thời gian đó?). Có lẽ start, direction, speed
và start, headto, spead, acceleration
cả hai đều mô tả các loại quỹ đạo, nhưng một lần nữa, tùy thuộc vào bạn để thiết kế lớp nhận để biết cách giải nén chúng và xử lý chúng.