python __str__()、__iter__()迭代器

打印類實例調用的方法__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錯誤時退出循環。

  1. __iter__():迭代器,生成迭代對象時調用,返回值必須是對象自己,然後for可以循環調用next方法
  2. 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
發佈了65 篇原創文章 · 獲贊 10 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章