Điều này đã khiến tôi đau đầu hai lần gần đây (tôi biết tôi nên học hỏi từ sai lầm của mình lần đầu tiên) và câu trả lời được chấp nhận đã không giúp ích cho tôi lần nào vì vậy trong khi nó còn mới mẻ trong đầu tôi, tôi nghĩ tôi sẽ gửi câu trả lời của riêng mình để đề phòng bất kỳ ai khác đang gặp phải vấn đề này (hoặc tôi cần điều này một lần nữa trong tương lai).
Trong trường hợp của tôi, vấn đề là tôi đang chuyển một kwarg vào phần khởi tạo của lớp con nhưng trong lớp cha, từ khóa arg sau đó đã được chuyển vào lệnh gọi super ().
Tôi luôn nghĩ rằng những loại này là tốt nhất với một ví dụ:
class Foo(object):
def __init__(self, required_param_1, *args, **kwargs):
super(Foo, self).__init__(*args, **kwargs)
self.required_param = required_param_1
self.some_named_optional_param = kwargs.pop('named_optional_param', None)
def some_other_method(self):
raise NotImplementedException
class Bar(Foo):
def some_other_method(self):
print('Do some magic')
Bar(42)
Bar(42, named_optional_param={'xyz': 123})
Vì vậy, để giải quyết vấn đề này, tôi chỉ cần thay đổi thứ tự mà tôi thực hiện mọi việc trong phương thức Foo .__ init__; ví dụ:
class Foo(object):
def __init__(self, required_param_1, *args, **kwargs):
self.some_named_optional_param = kwargs.pop('named_optional_param', None)
super(Foo, self).__init__(*args, **kwargs)
self.required_param = required_param_1