1. 程式人生 > >python 模塊會導入幾次?猴子補丁為什麽可以實現?

python 模塊會導入幾次?猴子補丁為什麽可以實現?

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 模塊會導入幾次?猴子補丁為什麽可以實現?