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

7 Ways to Write a Smarter ReprMixin in Python
7 Ways to Write a Smarter ReprMixin in Python

 

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})"

 

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})"

 

 

Tag list:

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.