打印類實例調用的方法__str__ |
對於用戶自定義的類,打印其實例的時候,輸出的格式是該類所屬的模塊+類實例的內存地址。當然python也提供了一個__str__方法,用戶只需要重寫這個方法,就能夠定製對類實例的打印輸出。
>>> class Student(object):
... def __init__(self, name):
... self.name = name
...
>>> print Student('Michael')
<__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__()是爲調試服務的。
解決辦法是再定義一個__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
循環,類似list或者tuple,就必須實現一個__iter__()
方法,該方法返回一個迭代對象。然後Python的for循環就會不斷調用該對象的next()
方法拿到下一個值,直到遇到StopIteration錯誤時退出循環。
- __iter__():迭代器,生成迭代對象時調用,返回值必須是對象自己,然後for可以循環調用next方法
- next():每一次for循環都調用該方法(必須存在)
class IterInstance(object):
"""
"""
def __init__(self, num):
self.num = num
self.start_num = -1
def __iter__(self):
"""
迭代器,生成迭代對象時調用,返回值必須是一個迭代對象
一般是對象自己,然後for可以循環調用這個可迭代對象的next方法
"""
print '__iter__'
return self
def next(self):
'''
每一次for循環都調用該方法(必須存在)
'''
self.start_num += 1
if self.start_num >= self.num:
raise StopIteration()
return self.start_num
if __name__ == "__main__":
for i in IterInstance(10):
print i