[英]Is it OK to name an instance the same as a module?
我經常發現,將包含類定義的模塊和該類的實例都用小寫命名,並使用駝峰式作為類名都是“自然的”。 例如,我要這樣做:
In [2]: from publisher import Publisher
In [3]: publisher = Publisher()
在這里,我有一個名為publisher
的模塊,但是還有一個以相同方式調用的Publisher
實例。 似乎模塊和實例都按預期“工作”:
In [4]: from publisher import RandomData
In [5]: publisher.random.uuid()
Out[5]: 'c490508d-2071-536e-2f38-4b03b04351e1'
我從模塊中導入了另一個類,並稱為實例方法。 是我的意思是模塊還是實例,Python是否“從上下文理解”? 以這種方式重用名稱可以嗎?
您沒有在遮掩任何東西,這里沒有重用任何名稱。 在您使用publisher = Publisher()
創建實例之前, 尚未在名稱空間中使用 publisher
名稱。 如果您嘗試在NameError
from publisher import Publisher
行之后立即使用名稱publisher
,則會出現NameError
異常。
這是因為from <module> import <name>
表單僅在名稱空間中設置<name>
。 從何處導入<name>
都沒有關系; 絕對不會在名稱空間中獲得<module>
名稱。
換句話說, from publisher import Publisher
語句基本上轉換為:
if 'publisher' not in sys.modules:
# find and load the publisher module
# sys.modules['publisher'] = newly_loaded_module
Publisher = sys.modules['publisher'].Publisher # set the Publisher global
除了名稱sys
從未在您的命名空間中設置外,Python只是直接在內部訪問sys.modules
。
因此,從技術角度來看:不,這很好。
您可能會發現,將模塊名稱用於實例變量可能會混淆該名稱所指向的代碼的未來讀者(如果不是Python的話)。
您可能也對此感到困惑
import publisher
publisher = publisher.Publisher()
那可能會使模塊蒙上陰影。 import publisher
行import publisher
設置全局名稱publisher
,然后在下一行中用新的對象引用替換 publisher
。
轉換為相同的sys.modules
語言,您可以這樣做:
if 'publisher' not in sys.modules:
# find and load the publisher module
# sys.modules['publisher'] = newly_loaded_module
publisher = sys.modules['publisher'] # set the publisher global
publisher = publisher.Publisher() # set the publisher global to something else
也可以, 除非您期望publisher.Publisher()
稍后再使用。 publisher
不再引用該模塊,因此可能導致問題。 對於人類讀者而言,這更加令人困惑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.