讓實例打印出來好看
__str__
__repr__
class Student(object):
def __init__(self, name):
self.name = name
def __str__(self):
return 'Student object (name=%s)' % self.name
__repr__ = __str__
>>> print(Student('Michael'))
Student object (name: Michael)
#沒有__str__就會是這樣
#>>> print(Student('Michael'))
#<__main__.Student object at 0x109afb190>
>>> s = Student('Michael')
>>> s
Student object (name: Michael)
#沒有__repr__就會是這樣
<__main__.Student object at 0x109afb310>
__iter__
__next__
該方法返回一個迭代對象,然后,Python的for循環就會不斷調用該迭代對象的__next__()方法拿到循環的下一個值,直到遇到StopIteration錯誤時退出循環。
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化兩個計數器a,b
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
3
5
...
46368
75025
__getitem__
Fib實例雖然能作用于for循環,看起來和list有點像,但是,把它當成list來使用還是不行
實現__getitem__()方法就可以按下標訪問數列的任意一項
list有個神奇的切片方法對于Fib卻報錯。原因是__getitem__()傳入的參數可能是一個int,也可能是一個切片對象slice,所以要做判斷.
但是沒有對step參數作處理,也沒有對負數作處理,所以,要正確實現一個__getitem__()還是有很多工作要做的。
__getattr__
__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.
通過callable()函數,我們就可以判斷一個對象是否是“可調用”對象。