您的位置:首页 > 编程语言 > Python开发

python __str__,__repr__,__call__()

2017-06-15 21:30 459 查看
__str__()和__repr__()

只需要定义好
__str__()
方法,返回一个好看的字符串就可以了:
>>> class Student(object):
...     def __init__(self, name):
...         self.name = name
...     def __str__(self):
...         return 'Student object (name: %s)' % self.name
...
>>> print(Student('Michael'))
Student object (name: Michael)


这样打印出来的实例,不但好看,而且容易看出实例内部重要的数据。

但是细心的朋友会发现直接敲变量不用
print
,打印出来的实例还是不好看:
>>> s = Student('Michael')
>>> s
<__main__.Student object at 0x109afb310>


这是因为直接显示变量调用的不是
__str__()
,而是
__repr__()
,两者的区别是
__str__()
返回用户看到的字符串,而
__repr__()
返回程序开发者看到的字符串,也就是说,
__repr__()
是为调试服务的。

解决办法是再定义一个
__repr__()
。但是通常
__str__()
__repr__()
代码都是一样的,所以,有个偷懒的写法:
class Student(object):
def __init__(self, name):
self.name = name
def __str__(self):
return 'Student object (name=%s)' % self.name
__repr__ = __str__


__call__

一个对象实例可以有自己的属性和方法,当我们调用实例方法时,我们用
instance.method()
来调用。能不能直接在实例本身上调用呢?在Python中,答案是肯定的。

任何类,只需要定义一个
__call__()
方法,就可以直接对实例进行调用。请看示例:
class Student(object):
def __init__(self, name):
self.name = name

def __call__(self):
print('My name is %s.' % self.name)


调用方式如下:
>>> s = Student('Michael')
>>> s() # self参数不要传入
My name is Michael.


__call__()
还可以定义参数。对实例进行直接调用就好比对一个函数进行调用一样,所以你完全可以把对象看成函数,把函数看成对象,因为这两者之间本来就没啥根本的区别。

如果你把对象看成函数,那么函数本身其实也可以在运行期动态创建出来,因为类的实例都是运行期创建出来的,这么一来,我们就模糊了对象和函数的界限。

那么,怎么判断一个变量是对象还是函数呢?其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个
Callable
对象,比如函数和我们上面定义的带有
__call__()
的类实例:
>>> callable(Student())
True
>>> callable(max)
True
>>> callable([1, 2, 3])
False
>>> callable(None)
False
>>> callable('str')
False


通过
callable()
函数,我们就可以判断一个对象是否是“可调用”对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: