看到類似__slots__這種形如__xxx__的變量或者函數(shù)名就要注意,這些在Python中是有特殊用途的。
__slots__我們已經(jīng)知道怎么用了,__len__()方法我們也知道是為了能讓class作用于len()函數(shù)。
除此之外,Python的class中還有許多這樣有特殊用途的函數(shù),可以幫助我們定制類。
__str__
我們先定義一個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)
這樣打印出來的實例,不但好看,而且容易看出實例內(nèi)部重要的數(shù)據(jù)。
但是細(xì)心的朋友會發(fā)現(xiàn)直接敲變量不用print,打印出來的實例還是不好看:
代碼如下:
>>> s = Student('Michael')
>>> s
<__main__.Student object at 0x109afb310>
這是因為直接顯示變量調(diào)用的不是__str__(),而是__repr__(),兩者的區(qū)別是__str__()返回用戶看到的字符串,而__repr__()返回程序開發(fā)者看到的字符串,也就是說,__repr__()是為調(diào)試服務(wù)的。
解決辦法是再定義一個__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__
__iter__
如果一個類想被用于for ... in循環(huán),類似list或tuple那樣,就必須實現(xiàn)一個__iter__()方法,該方法返回一個迭代對象,然后,Python的for循環(huán)就會不斷調(diào)用該迭代對象的next()方法拿到循環(huán)的下一個值,直到遇到StopIteration錯誤時退出循環(huán)。
我們以斐波那契數(shù)列為例,寫一個Fib類,可以作用于for循環(huán):
代碼如下:
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化兩個計數(shù)器a,b
新聞熱點
疑難解答
圖片精選