Python面向对象编程第11篇 特殊方法之__str__和__repr__

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python面向对象编程第11篇 特殊方法之__str__和__repr__相关的知识,希望对你有一定的参考价值。

本篇我们介绍如何利用 Python __str__ 和 __repr__ 方法定义对象的字符串表示,以及它们之间的区别。

__str__ 方法简介

以下代码定义了一个类 Person:

class Person:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

Person 类包含三个属性:first_name、last_name 以及 age。

以下代码创建一个新的 Person 类实例并打印了该对象:

person = Person('John', 'Doe', 25)
print(person)

输出结果如下:

<__main__.Person object at 0x0000023405854D90>

当我们使用 print() 函数打印 Person 类的实例时,输出的是该实例的内存地址。

有时候,为实例定义一个字符串表示很有用。为此,我们需要实现特殊的 __str__ 方法。当实例调用 str() 方法时,Python 会在内部调用 __str__ 方法。

注意,print() 函数会将所有的非关键字参数转换为字符串,方法就是将参数传递给 str() 函数,然后显示返回的字符串。

以下示例为 Person 类实现了 __str__ 方法:

class Person:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

    def __str__(self):
        return f'Person(self.first_name,self.last_name,self.age)'

当我们使用 print() 函数打印 Person 类的实例时,Python 会调用 Person 类中定义的 __str__ 方法。例如:

person = Person('John', 'Doe', 25)
print(person)

输出结果如下:

Person(John,Doe,25)

__repr__ 方法简介

__repr__ 方法定义了将类的实例作为参数传递给 repr() 方法时的行为。__repr__ 方法返回了对象的字符串表示,通常是一个可以执行的字符串。如果我们将 object_name.__repr__() 方法返回的字符串传递给 eval() 函数,将会获得和 object_name 相同的内容。

下面我们使用 repr() 方法打印 person 对象的字符串表示:

person = Person('John', 'Doe', 25)
print(repr(person))

输出结果如下:

<__main__.Person object at 0x0000023405854A30>

默认输出的结果也是对象的内存地址。如果想要自定义对象的字符串表示,可以实现以下 __repr__ 方法:

class Person:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

    def __repr__(self):
        return f'Person("self.first_name","self.last_name",self.age)'

当我们将一个 Person 类的实例作为参数传递给 repr() 方法,Python 会自动调用 __repr__ 方法。例如:

person = Person("John", "Doe", 25)
print(repr(person))

输出结果如下:

Person("John","Doe",25)

如果我们执行返回的字符串 Person(“John”,“Doe”,25),它会返回一个 person 对象。

如果一个类没有实现 __str__ 方法,当我们将类的实例传递给 str() 方法时,Python 会返回 __repr__ 方法的结果,因为在内部 __str__ 方法调用了 __repr__ 方法。

例如:

person = Person('John', 'Doe', 25)
print(person)

输出结果如下:

Person("John","Doe",25)

如果一个类实现了 __str__ 方法,当我们将类的实例传递给 str() 方法时,Python 会调用 __str__ 方法。例如:

class Person:
    def __init__(self, first_name, last_name, age):
        self.first_name = first_name
        self.last_name = last_name
        self.age = age

    def __repr__(self):
        return f'Person("self.first_name","self.last_name",self.age)'

    def __str__(self):
        return f'(self.first_name,self.last_name,self.age)'


person = Person('John', 'Doe', 25)
# use str()
print(person)

# use repr()
print(repr(person))

食醋结果如下:

(John,Doe,25)
Person("John","Doe",25)

两种方法比较

__str__ 和 __repr__ 方法的主要区别是它们的目标用户不同。

__str__方法返回的字符串是为了给终端用户使用,而 __repr__ 方法返回的字符串是为了给机器使用。

总结

  • __str__ 和 __repr__ 方法都可以实现对象的字符串形式,__str__ 方法默认调用了 __repr__ 方法。

以上是关于Python面向对象编程第11篇 特殊方法之__str__和__repr__的主要内容,如果未能解决你的问题,请参考以下文章

Python面向对象编程第14篇 特殊方法之__bool__

Python面向对象编程第14篇 特殊方法之__bool__

Python面向对象编程第15篇 特殊方法之__del__

Python面向对象编程第15篇 特殊方法之__del__

Python面向对象编程第12篇 特殊方法之__eq__

Python面向对象编程第12篇 特殊方法之__eq__