簡體   English   中英

將實例命名為模塊可以嗎?

[英]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 publisherimport 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM