你究竟有(init)幾個好(子)妹(模)妹(塊)圈澈?
當我們在init()的時候,我們在干什么
init
這個單詞在我們用python進行面向?qū)ο箝_發(fā)的時候是跑不了的按价。理解python的__init__
其實就是和這里的init作用差不多惭适。做的工作都是初始化.
在和孩子解釋這個概念的時候,我的理解還是楼镐,保持它的專業(yè)性癞志,告訴他們這個專有名詞——初始化(initialize vt.)。至于他在干什么框产,我的解釋是這樣的:
我們已經(jīng)知道python有一個特殊的“工具包(模塊)”叫pygame了凄杯。在我們要動手用它完成我們的想法之前师溅,電腦這個強迫癥需要我們檢查一遍,這個工具包是否完整盾舌,能否正常給我們提供幫助墓臭。而這個檢查的動作,就是
pygame.init()
那么init()實際上檢查了哪些東西呢妖谴?
這個其實也不難實驗窿锉。直接在shell里面,我執(zhí)行了這個函數(shù):
>>> import pygame
>>> pygame.init()
(6, 0)
不明所以的膝舅,他給了我一個元組(6,0)
嗡载,我也很不理解,這個6和0分別代表什么意思仍稀。所以查閱了pygame的官方文檔
initialize all imported pygame modules
init() -> (numpass, numfail)
Initialize all imported pygame modules. No exceptions will be raised if a module fails, but the total number if successful and failed inits will be returned as a tuple. You can always initialize individual modules manually, but
pygame.init()
is a convenient way to get everything started. Theinit()
functions for individual modules will raise exceptions when they fail.You may want to initialize the different modules separately to speed up your program or to not use things your game does not.
It is safe to call this
init()
more than once: repeated calls will have no effect. This is true even if you havepygame.quit()
all the modules.初始化所有導入的pygame模塊洼滚。如果模塊失敗,則不會引發(fā)異常技潘,但如果成功且失敗的總數(shù)將作為元組返回遥巴。您可以隨時手動初始化單個模塊,但pygame.init()初始化所有導入的pygame模塊是一種方便的方法來啟動所有內(nèi)容享幽。各個模塊的init()函數(shù)會在失敗時引發(fā)異常铲掐。
您可能希望單獨初始化不同的模塊以加速您的程序或不使用您的游戲沒有的東西。
不止一次調(diào)用此init()是安全的:重復調(diào)用將不起作用值桩。即使你有pygame.quit()所有模塊也是如此摆霉。
關(guān)于init()的一個意外的實驗
我以前從來沒有深究過pygame.init()
這個函數(shù)究竟init了哪些模塊,僅僅在實踐的過程中知道奔坟,音頻播放和創(chuàng)建文字字體的時候携栋,如果沒有init就會報錯。
今天我在安裝我的新的電腦環(huán)境的時候咳秉,因為不知道電腦的型號婉支,所以并沒有特意去搜索和安裝電腦對應(yīng)的驅(qū)動。結(jié)果在安裝完python之后滴某,安裝pygame(wheel也要安裝)之后磅摹,運行常規(guī)的測試函數(shù)pygame.init()
返回的數(shù)字是(5,1)
排除問題的方法就是把已知可以init()
的子模塊都先運行掉霎奢。經(jīng)過排查户誓,發(fā)現(xiàn)pygame無法調(diào)用聲卡驅(qū)動。剩下的事情就好辦很多了幕侠,重新安裝一下聲卡驅(qū)動帝美,重啟之后就可以正常init了。
但是在這個過程中晤硕,我可以得出比以前更加接近實際的一個結(jié)論:
pygame.init()
在做的悼潭,其實就是檢查庇忌,電腦上一些需要的硬件調(diào)用接口、基礎(chǔ)功能是否有問題舰褪。如果有皆疹,他會在程序運行之前就反饋給你,方便你進行排查和規(guī)避占拍。
說了這么多略就,它到底init了哪些子模塊
>>> import pygame
>>> pygame.init()
(6, 0)
>>> pygame.display.init()
>>> pygame.font.init()
>>> pygame.joystick.init()
>>> pygame.mixer.init()
>>> pygame.freetype.init()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'pygame' has no attribute 'freetype'
>>> pygame.midi.init()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'pygame' has no attribute 'midi'
>>> pygame.cdrom.init()
>>> pygame.scrap.init()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
pygame.error: No display mode is set
我把pygame官網(wǎng)上面的doc里介紹的所有帶有init的子模塊都運行了一遍。其中midi和freetype這兩個模塊已經(jīng)沒有了(吐槽一下官方的文檔吧晃酒,都沒了還放著嘛)表牢。最后一個scrap初始化是因為沒有窗口。這樣的話贝次,其實已經(jīng)有5個模塊是被初始化了崔兴。但是scrap在沒有窗口的情況下會報錯,到底算不算一個init蛔翅。還需要后面再仔細看看文檔和源碼吧敲茄。