您的位置:首页 > 其它

定制类

2015-10-23 22:11 134 查看
看到类似
__slots__
这种形如
__xxx__
的变量或者函数名就要注意,这些在Python中是有特殊用途的。

__slots__
我们已经知道怎么用了,
__len__()
方法我们也知道是为了能让class作用于
len()
函数。

除此之外,Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类。

1.__str__ 和 __repr__

我们先定义一个
Student
类,打印一个实例:

class Student(object):

def __init__(self,name):
self.name = name

>>> print(Student('Michael'))
<__main__.Student object at 0x109afb190>


打印出一堆<__main__.Student object at 0x109afb190>,不好看。

怎么才能打印得好看呢?只需要定义好
__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__()
是为调试服务的。

class Student(object):

def __init__(self,name):
self.name = name

def __str__(self):
return 'Student object (name: %s)' % self.name

def __repr__(self):
return 'Student object (name: %s)' % self.name

>>> s = Student('Michael')
>>> s
Student object (name: Michael)


通常
__str__()
__repr__()
代码都是一样的,所以,有个偷懒的写法:

class Student(object):

def __init__(self,name):
self.name = name

def __str__(self):
return 'Student object (name: %s)' % self.name

__repr__ = __str__
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: