python super

關於super的做用:

https://stackoverflow.com/questions/576169/understanding-python-super-with-init-methods
StackOverflow上的這個問題很是有價值,有1900+的star 做者舉出了本身的例子,大意是代碼不須要super也能實現這樣的邏輯,爲何要無故引入super呢?下面都個1300+讚的回答,他的回答要點是:html

  1. lets you avoid referring to the base class explicitly, which can be nice.
  2. But the main advantage comes with multiple inheritance, where all sorts of fun stuff can happen

回答中引用了這篇博文:
https://www.artima.com/weblogs/viewpost.jsp?thread=236275 這篇文章我暫時沒有足夠的時間去理解它。python

第二個回答 https://stackoverflow.com/a/27134600/7360457 強調了:super的重要不在於避免寫出父類,而是在於確保方法引用順序(MRO)被調用,而且答主給出了代碼解釋。多繼承時(若是不使用),第一個父類的__init__被調用了,可是第二類的__int__沒有被調用,僅僅執行了一個。web

個人結論:super在多繼承時扮演着很是重要的角色,多繼承時,super函數告訴咱們會MRO的解析順序列表中查找下個父類的方法,供子類去使用。每執行一次,就對MRO調用了一次nextapp

http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035005.html
博客園的這篇文章也提到了爲何要用super?jsp

很好理解去從父類中繼承(屬性或者方法),可是我不理解爲何要繼承自身?函數

class Mmap(object):
    """
    Convenience class for opening a read-only memory map for a file path.
    """

    def __init__(self, filename):
        super(Mmap, self).__init__()   # 繼承父類的方法
        self._filename = filename
        self._f = None
        self._mmap = None

    def __enter__(self):
        self._f = open(self._filename, "rb")
        self._mmap = mmap.mmap(self._f.fileno(), 0, access=mmap.ACCESS_READ)
        return self._mmap

    def __exit__(self, type, value, traceback):
        self._mmap.close()
        self._f.close()

解讀:

super(Mmap, self).__init__() 的解釋:https://stackoverflow.com/questions/576169/understanding-python-super-with-init-methodspost

相關文章
相關標籤/搜索