【Python】【魔术方法】(二)对象的字符串表示

在Python中,__str__, __repr__, 和 __format__ 是三个非常常用的特殊方法(也称为魔术方法或dunder方法),用于对对象进行字符串化表示。这些方法在对象需要以字符串形式展示时特别有用,例如在打印对象或进行格式化输出时。下面分别详细介绍这三个方法:

1. __str__ 方法

__str__ 方法返回一个“用户友好”的字符串表示形式。这个方法通常用于 print() 函数或 str() 函数调用时。目的是让人容易理解,适合作为直接输出的内容。

  • 格式

    def __str__(self):
        return "字符串表示"
    
  • 示例

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        
        def __str__(self):
            return f"Person: {self.name}, {self.age} years old"
    
    p = Person("Alice", 30)
    print(p)  # 输出: Person: Alice, 30 years old
    

2. __repr__ 方法

__repr__ 方法返回一个“开发友好”的字符串表示形式。这个方法通常用于调试和开发,目的是让开发人员能够清楚地看到对象的内部状态。返回的字符串应该尽可能详细,最好能够包含足够的信息来重新创建对象。

  • 格式

    def __repr__(self):
        return "详细字符串表示"
    
  • 示例

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        
        def __repr__(self):
            return f"Person(name={self.name!r}, age={self.age!r})"
    
    p = Person("Alice", 30)
    print(repr(p))  # 输出: Person(name='Alice', age=30)
    

3. __format__ 方法

__format__ 方法用于自定义对象的格式化输出。这个方法通常在使用 format() 函数或 f-string 进行格式化时调用。__format__ 方法接收一个格式字符串,并返回根据该格式字符串格式化的字符串。

  • 格式

    def __format__(self, format_spec):
        return "格式化后的字符串"
    
  • 示例

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        
        def __format__(self, format_spec):
            if format_spec == "name":
                return self.name
            elif format_spec == "age":
                return str(self.age)
            else:
                return f"Person: {self.name}, {self.age} years old"
    
    p = Person("Alice", 30)
    print(format(p, "name"))  # 输出: Alice
    print(format(p, "age"))   # 输出: 30
    print(format(p, ""))      # 输出: Person: Alice, 30 years old
    

总结

  • __str__:用于返回对象的用户友好字符串表示。
  • __repr__:用于返回对象的开发友好字符串表示。
  • __format__:用于自定义对象的格式化输出。

通常情况下,如果定义了 __repr__ 而没有定义 __str__,Python 会使用 __repr__ 作为 __str__ 的后备方法。因此,定义 __repr__ 是一个好习惯,因为它可以确保在需要时总有一个合理的字符串表示。

posted @ 2025-03-25 10:42  berlin-fly  阅读(47)  评论(0)    收藏  举报