视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
python学习笔记-魔术方法,让自定义类更像内置类型
2020-11-27 14:26:38 责编:小采
文档

Python的魔术方法是Python中那些预定义的像__XXX__类型的函数。
使用Python的魔术方法的最大优势在于python提供了简单的方法让对象可以表现得像内置类型一样。

__str__函数

__str__函数用于处理打印实例本身的时候的输出内容。如果没有覆写该函数,则默认输出一个对象名称和内存地址。
例如:

>>> class Student(object):
... def __init__(self,name):
... self._name = name
...
>>> print Student()

输出:<__main__.Student object at 0x0000000002A929E8>.
那么我们如何让输出的结果可读性更高一点呢?我们可以覆写__str__函数。例如

>>> class Student(object):
... def __init__(self, name):
... self._name = name
... def __str__(self):
... return "I'm a student, named %s" % self._name
...
>>> print Student("Charlie")

输出结果就是:I'm a student, named Charlie.
我们将str()函数作用于该对象的时候,其实是调用了该对象的__str__函数。

_repr_ 函数

__repr__也是将对象序列化,但是__repr__更多的是给python编译器看的。__str__更多的是可读性(readable)。
我们将repr()函数作用于摸某一个对象的时候,调用的其实就是该函数的__repr__函数。

repr()成对的是eval()函数。eval()函数是将序列化后的对象重新转为对象。前提是该对象实现了__repr__函数。

上面这一段话基于自己的理解,不知道对错。

>>> item = [1,2,3]
>>> repr(item)
'[1, 2, 3]'
>>> other_item = eval(repr(item))
>>> other_item[1]
2

__iter__函数

我们经常对list或者tuple使用for...in...来迭代。那是list继承自Iterable。Iterable实现了__iter__函数。

要想将一个自定义的对象变成一个可迭代的对象,那么必须要实现两个方法:__iter__next.

__iter__函数返回一个对象。迭代的时候则会不断地调用next函数拿到下一个值,直到捕获到StopIteration停止。
廖雪峰老师教程里写的是__next__方法,不知道为啥。

class Fib(object):
 def __init__(self):
 self.a, self.b = 0, 1

 def __iter__(self):
 return self

 def next(self):
 self.a, self.b = self.b, self.a + self.b
 if self.a > 10000:
 raise StopIteration
 return self.a


for i in Fib():
 print i

__getitem__函数

上面通过实现__iter__函数实现对象的迭代。
那么如何实现对象按下标取出元素呢。
这是通过实现对象的__getitem__方法。
我们来举一个

下载本文
显示全文
专题