python 模塊會導入幾次?猴子補丁為什麽可以實現?
阿新 • • 發佈:2018-07-25
mce 多少 urn import 所有 ffffff 直觀 不用 人的
一共三個文件
a.py內容是
print(‘被導入‘)
x = 1
b.py內容是
import a
a.x = 2
c.py內容是
import a
import b
print(a.x)
現在運行c文件,這個結果出乎很多人的意料大部分python人員都猜不對,結果是
1、可以發現a模塊被兩個地方導入了,但是只打印一次 “被導入”。
2、在c文件裏面不管是先導入a還是導入b,打印x的結果都是2。
不光是自己的文件如此,導入庫文件也是一樣。所以這就是猴子補丁能實現的原因。
2、再多想一下,為什麽要面向對象了,不面向對象,直接模塊加全局變量,會造成多個地方全局變量互相幹擾。有了類,類天然就是多實例,類的所有實例就像是無數個全局變量互不幹擾的復制模塊。
2.1不用面向對象也可以實現多實例,原來是狗寫成全局變量了,需要改成從函數return一只狗,然後有個吃翔的函數,把這個return出來的狗傳給這個函數,所以形式是
eat(dog,sheet)
2.2用面向對象,那麽就不是狗模塊了,有個狗類,狗吃翔變成了
dog = Dog()
dog.eat(sheeet)
那麽多個狗就實例化多次,每個狗 吃了多少翔 體重變化了多少,都是完全獨立的。
2.1的面向過程模擬多實例,需要在類外傳入和保存很多狗的屬性和狀態,多個函數使用同一個類型的傳參,很頻繁,不是很容易看懂,例如a函數的第一個參數和b函數的第一個參數是代表同一個東西比如狗的名字,有的人在a函數寫dog_name,在b
函數寫name,真的不容易看出來他們的關聯。如果是面向對象,那是很直觀的,a方法和b方法都是引用self.name。
扯遠了從模塊導入機制 到了猴子補丁 面向過程 面向對象了。
python 模塊會導入幾次?猴子補丁為什麽可以實現?