[Mẹo] Lớp DotDict trong Python
By JoeVu, at: 18:08 Ngày 22 tháng 11 năm 2023
Thời gian đọc ước tính: __READING_TIME__ minutes
![[Tips] Python DotDict Class](/media/filer_public_thumbnails/filer_public/6a/fd/6afd43f5-0976-481e-abcb-7bf1eaca6d2d/python_dotdict.png__1500x900_crop_subsampling-2_upscale.png)
![[Tips] Python DotDict Class](/media/filer_public_thumbnails/filer_public/6a/fd/6afd43f5-0976-481e-abcb-7bf1eaca6d2d/python_dotdict.png__400x240_crop_subsampling-2_upscale.png)
Bạn có thể tạo một lớp DotDict
trong Python để truy cập các khóa từ điển như thuộc tính. Đây là một triển khai đơn giản:
class DotDict(dict):
"""Lớp DotDict cho phép truy cập các khóa từ điển như thuộc tính."""
def __getattr__(self, attr):
if attr in self:
return self[attr]
raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{attr}'")
def __setattr__(self, key, value):
self[key] = value
def __delattr__(self, item):
try:
del self[item]
except KeyError:
raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{item}'")
# Ví dụ sử dụng:
my_dict = {'name': 'Joe', 'age': 30, 'city': 'Hanoi'}
dot_dict = DotDict(my_dict)
# Truy cập các khóa từ điển như thuộc tính
print(dot_dict.name) # Kết quả: Joe
print(dot_dict.age) # Kết quả: 30
print(dot_dict.city) # Kết quả: Hanoi
# Thay đổi giá trị bằng thuộc tính
dot_dict.age = 31
print(dot_dict.age) # Kết quả: 31
# Xóa một thuộc tính (cặp khóa-giá trị)
del dot_dict.city
# Truy cập thuộc tính đã xóa sẽ gây ra lỗi AttributeError
# print(dot_dict.city) # Bỏ comment dòng này sẽ gây ra lỗi AttributeError
Trong ví dụ này, lớp DotDict
là một lớp con của lớp dict
tích hợp sẵn. Nó ghi đè các phương thức __getattr__
, __setattr__
và __delattr__
để cho phép truy cập kiểu thuộc tính vào các khóa từ điển.
Hãy nhớ rằng cách tiếp cận này có một số hạn chế. Ví dụ: nếu từ điển của bạn chứa các khóa trùng với tên thuộc tính hiện có hoặc nếu bạn muốn sử dụng các khóa có tên không phải là tên thuộc tính hợp lệ, bạn có thể gặp sự cố.
Hạn chế
Mặc dù lớp DotDict
cung cấp một cách thuận tiện để truy cập các khóa từ điển như thuộc tính, nhưng có một số hạn chế cần xem xét:
- Trùng tên thuộc tính: Nếu từ điển của bạn chứa các khóa trùng với tên phương thức hoặc thuộc tính hiện có của lớp
dict
, nó có thể gây ra hành vi không mong muốn.
- Tên thuộc tính không hợp lệ: Các khóa không phải là tên thuộc tính hợp lệ (ví dụ: chứa khoảng trắng hoặc bắt đầu bằng số) không thể truy cập bằng ký hiệu chấm.
- Chi phí hiệu năng: Ghi đè
__getattr__
,__setattr__
và__delattr__
có thể dẫn đến một số chi phí hiệu năng so với việc sử dụng các phương thức từ điển tiêu chuẩn.
Kết luận
Lớp DotDict
là một giải pháp đơn giản và thanh lịch để truy cập các khóa từ điển như thuộc tính. Nó có thể làm cho mã của bạn sạch hơn và trực quan hơn. Tuy nhiên, hãy lưu ý những hạn chế của nó và xem xét xem nó có phù hợp với trường hợp sử dụng của bạn hay không. Nếu bạn gặp phải các khóa không phải là tên thuộc tính hợp lệ, bạn có thể cần phải sử dụng các phương thức truy cập từ điển truyền thống hoặc sử dụng một cách tiếp cận khác.