Tôi thường thấy mình ghi đè phương thức của lớp cha và không bao giờ có thể quyết định rõ ràng có nên liệt kê các thông số đã cho hoặc chỉ sử dụng cấu trúc mền *args, **kwargs
. Là một phiên bản tốt hơn so với khác? Có cách nào tốt nhất không? Tôi đang thiếu những lợi thế nào (dis-)?Thực hành tốt nhất thừa kế: * args, ** kwargs hoặc chỉ định rõ ràng các tham số
class Parent(object):
def save(self, commit=True):
# ...
class Explicit(Parent):
def save(self, commit=True):
super(Explicit, self).save(commit=commit)
# more logic
class Blanket(Parent):
def save(self, *args, **kwargs):
super(Blanket, self).save(*args, **kwargs)
# more logic
lợi ích nhận thức của biến thể rõ ràng
- rõ ràng hơn (Zen của Python)
- dễ dàng hơn để nắm bắt
- thông số chức năng dễ dàng truy cập
lợi ích cảm nhận của chăn biến nt
- hơn DRY
- tầng lớp phụ huynh có thể dễ dàng hoán đổi cho nhau
- thay đổi các giá trị mặc định trong phương pháp cha mẹ là tuyên truyền mà không cần chạm mã khác
Rất nhiều phụ thuộc vào chính xác những gì bạn đang phân lớp ...Nếu có một cơ hội cao mà bạn sẽ thêm (hoặc người khác sẽ) bổ sung kwargs vào các phương thức của lớp cơ sở, nó có nhiều ý nghĩa để gắn bó với '** kwargs'. Nếu điều này là không có khả năng, sau đó xác định rõ ràng kwargs chắc chắn là tốt hơn nhiều từ một quan điểm dễ đọc. –
Vâng, bạn chắc chắn đang vứt bỏ thông tin. * Rõ ràng là tốt hơn so với ngầm * và tất cả những điều đó. – kojiro
Bạn có hai lựa chọn: 1) đặt tên rõ ràng các tham số và * cấm * thay đổi chữ ký trong các lớp dẫn xuất (nếu không là goodluck với 'super' và multiple inheritance), hoặc 2) Sử dụng' ** kwargs' và cho phép thay đổi chữ ký của các phương thức . Mà một trong những nên được sử dụng có thể phụ thuộc vào tình hình. – Bakuriu