Tôi muốn viết một lớp tùy chỉnh hoạt động như dict
- vì vậy, tôi đang kế thừa từ dict
.
Tuy nhiên, câu hỏi của tôi là: Tôi có cần tạo một dict
thành viên riêng trong __init__()
phương thức của mình không ?. Tôi không hiểu vấn đề này, vì tôi đã códict
hành vi nếu tôi thừa kế từ đó dict
.
Bất cứ ai có thể chỉ ra lý do tại sao hầu hết các đoạn mã kế thừa trông giống như hình dưới đây?
class CustomDictOne(dict):
def __init__(self):
self._mydict = {}
# other methods follow
Thay vì đơn giản hơn ...
class CustomDictTwo(dict):
def __init__(self):
# initialize my other stuff here ...
# other methods follow
Trên thực tế, tôi nghĩ rằng tôi nghi ngờ câu trả lời cho câu hỏi là người dùng không thể truy cập trực tiếp từ điển của bạn (tức là họ phải sử dụng các phương pháp truy cập mà bạn đã cung cấp).
Tuy nhiên, còn toán tử truy cập mảng []
thì sao? Làm thế nào một người sẽ thực hiện điều đó? Cho đến nay, tôi chưa thấy một ví dụ nào cho thấy cách ghi đè []
toán tử.
Vì vậy, nếu một []
chức năng truy cập không được cung cấp trong lớp tùy chỉnh, các phương thức cơ sở kế thừa sẽ hoạt động trên một từ điển khác?
Tôi đã thử đoạn mã sau để kiểm tra hiểu biết của mình về tính kế thừa Python:
class myDict(dict):
def __init__(self):
self._dict = {}
def add(self, id, val):
self._dict[id] = val
md = myDict()
md.add('id', 123)
print md[id]
Tôi gặp lỗi sau:
KeyError: <id hàm tích hợp sẵn>
Có gì sai với đoạn mã trên?
Làm cách nào để sửa lớp myDict
để tôi có thể viết mã như thế này?
md = myDict()
md['id'] = 123
[Biên tập]
Tôi đã chỉnh sửa mẫu mã ở trên để loại bỏ lỗi ngớ ngẩn mà tôi đã mắc phải trước khi rời khỏi bàn làm việc. Đó là lỗi đánh máy (đáng lẽ tôi phải phát hiện ra nó từ thông báo lỗi).
dict
, thì bạn nên sử dụng chính đối tượng đó (sử dụngsuper
) thay vì chỉ ủy quyền cho cá thể__dict__
đó - về cơ bản có nghĩa là bạn đang tạo hai phái cho mỗi cá thể.