欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python自定义类中内部函数:__repr__()和__string__()的应用

程序员文章站 2024-02-12 11:02:40
...

我们在定义Python类时,经常会看到比较好的代码中,都有__repr__和__string__,两个内部函数的定义。但是我一直很少关注它们的区别和具体应用场景。稍微做个小结。

1.__foo()__在python中表示__foo__是一个私有private 函数,在CookBook pp254中,解释为,该函数不会被子类的相同名称的函数重载。一般地说,类中以“下划线”开头定义的变量或者函数都是私有变量或者内部函数,区别是:

  1.1 单下划线开始的变量或者函数表示非公有名称,会被子类初始化时处理,也就是说暴露给继承的子类。

  1.2 双下划线开头的变量或函数会对子类隐藏

2.__repr__(),可以被用于obj=eval(repr(obj)),也就说是可以用该函数返回值的字符串文本重新创建该类的实例;而__str__(),是将实例转换为一个字符串。

 

#coding:utf-8
class Test():
    def __init__(self,x,y):
        self.x=x
        self.y=y

    def __repr__(self):
        return 'Test({0.x!r},{0.y!r})'.format(self)   

    def __str__(self):   #convert the instance to string,then print out
        return '({0.x!s},{0.y!s})'.format(self)


#output:
In [4]: from my_repr import Test
In [5]: test=Test
In [6]: test
Out[6]: my_repr.Test
In [7]: test=Test(3,4)  #实例化对象
In [8]: test
Out[8]: Test(3,4)   #返回的是__repr__()中的字符串
In [9]: print(test)  #返回的是__str__()的值
(3,4)
In [10]: tt=eval(repr(test))  #tt是Test类的另一个实例
In [11]: tt
Out[11]: Test(3,4)
In [12]: id(tt)==id(test)
Out[12]: False
In [13]: id(tt)
Out[13]: 2302160271176
In [14]: id(test)
Out[14]: 2302160237176
In [15]: type(test)==type(tt)
Out[15]: True