我们在定义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