7 Cách Viết ReprMixin Thông Minh Hơn trong Python
By huyennt, at: 17:24 Ngày 08 tháng 4 năm 2025
Thời gian đọc ước tính: __READING_TIME__ phút


1. Minimalistic ReprMixin
Hiển thị tất cả các thuộc tính ở định dạng khóa=giá trị đơn giản
class ReprMixin:
def __repr__(self):
return f"<{self.__class__.__name__} {vars(self)}>"
2. Pretty ReprMixin (phân tách bằng dấu phẩy)
Sạch hơn và dễ đọc hơn
class PrettyReprMixin:
def __repr__(self):
attrs = ", ".join(f"{k}={v!r}" for k, v in vars(self).items())
return f"{self.__class__.__name__}({attrs})"
3. Whitelist ReprMixin
Chỉ hiển thị các thuộc tính cụ thể (bằng cách định nghĩa __repr_fields__
).
class WhitelistReprMixin:
__repr_fields__ = []
def __repr__(self):
fields = getattr(self, "__repr_fields__", vars(self).keys())
attrs = ", ".join(f"{k}={getattr(self, k)!r}" for k in fields if hasattr(self, k))
return f"{self.__class__.__name__}({attrs})"
Cách sử dụng:
class User(WhitelistReprMixin):
__repr_fields__ = ["username", "email"]
def __init__(self, username, email, password):
self.username = username
self.email = email
self.password = password
print(User("Joe", "[email protected]", "Glinteco is an awesome team"))
# User(username='Joe', email='[email protected]')
4. Blacklist ReprMixin
Ẩn các trường nhạy cảm (như mật khẩu)
class BlacklistReprMixin:
__repr_exclude__ = []
def __repr__(self):
attrs = ", ".join(
f"{k}={v!r}" for k, v in vars(self).items() if k not in self.__repr_exclude__
)
return f"{self.__class__.__name__}({attrs})"
Cách sử dụng:
class Account(BlacklistReprMixin):
__repr_exclude__ = ["password"]
def __init__(self, username, password):
self.username = username
self.password = password
print(Account("bob", "supersecret"))
# Account(username='bob')
5. Deep ReprMixin
Đệ quy biểu diễn các đối tượng lồng nhau
class DeepReprMixin:
def __repr__(self):
def safe_repr(obj):
if isinstance(obj, (list, tuple, set)):
return f"[{', '.join(map(safe_repr, obj))}]"
elif isinstance(obj, dict):
return f"{{{', '.join(f'{k}: {safe_repr(v)}' for k, v in obj.items())}}}"
elif hasattr(obj, "__repr__") and not isinstance(obj, str):
return obj.__repr__()
return repr(obj)
attrs = ", ".join(f"{k}={safe_repr(v)}" for k, v in vars(self).items())
return f"{self.__class__.__name__}({attrs})"
def __repr__(self):
def safe_repr(obj):
if isinstance(obj, (list, tuple, set)):
return f"[{', '.join(map(safe_repr, obj))}]"
elif isinstance(obj, dict):
return f"{{{', '.join(f'{k}: {safe_repr(v)}' for k, v in obj.items())}}}"
elif hasattr(obj, "__repr__") and not isinstance(obj, str):
return obj.__repr__()
return repr(obj)
attrs = ", ".join(f"{k}={safe_repr(v)}" for k, v in vars(self).items())
return f"{self.__class__.__name__}({attrs})"
6. Compact ReprMixin (với cắt ngắn)
Hữu ích cho các đối tượng lớn để ngăn chặn việc tràn nhật ký
class CompactReprMixin:
__repr_maxlen__ = 30
def __repr__(self):
parts = []
for k, v in vars(self).items():
text = repr(v)
if len(text) > self.__repr_maxlen__:
text = text[:self.__repr_maxlen__] + "..."
parts.append(f"{k}={text}")
return f"{self.__class__.__name__}({', '.join(parts)})"
7. Dataclass-style ReprMixin
Sắp xếp các thuộc tính theo thứ tự bảng chữ cái (giống như dataclasses)
class SortedReprMixin:
def __repr__(self):
attrs = ", ".join(
f"{k}={v!r}" for k, v in sorted(vars(self).items(), key=lambda x: x[0])
)
return f"{self.__class__.__name__}({attrs})"