1、str
如果我们定义一个类,打印出来实例如下:
>>> class Student(object):
... def __init__(self, name):
... self.name = name
...
>>> print(Student('Luffy'))
<__main__.Student object at 0x0000000001E827B8>
打印出<main.Student object at 0x0000000001E827B8>这一串并不好看,我们想返回一个比较好看的打印格式,那么就可以在类内部定义一个str()方法
>>> class Student(object):
... def __init__(self, name):
... self.name = name
... def __str__(self):
... return 'name:%s' % self.name
...
>>> print(Student('Luffy'))
name:Luffy
2、repr
但是,不用print()直接打印还是不好看:
>>> Student('Luffy')
<__main__.Student object at 0x0000000001E828D0>
因为显示打印调用的不是str()方法,而是repr()方法,如果想不通过print()就能显示实例变量,在类内部添加repr()方法即可,一般repr()方法和str()方法是一样的,直接把str赋值给repr即可
>>> class Student(object):
... def __init__(self, name):
... self.name = name
... def __str__(self):
... return 'name:%s' % self.name
... __repr__ = __str__
...
>>> Student('Luffy')
name:Luffy
>>>
3、iter
如果我们想像list、tuple那样用for循环迭代一个类对象,可以在类内部定义一个iter()方法,并且定义一个next()方法;因为Python的for循环会不断调用该迭代对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。
>>> 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 > 100000:
... raise StopIteration()
... return self.a
...
>>> for n in Fib():
... print(n)
...
1
1
2
...
17711
28657
4、getitem
根据上面的iter()方法,我们可以类似list、tuple用for循环,但是却还不能如list一样根据下标获取元素:
>>> f = Fib()
>>> f[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'Fib' object does not support indexing
此时,我们可以在类内部定义一个getitem()方法
>>> class Fib(object):
... def __getitem__(self, n):
... a, b = 1, 1
... for x in range(n):
... a, b = b, a + b
... return a
...
>>> f = Fib()
>>> f[10]
89
>>> f[0]
1
>>>