[英]Python modules vs classes
我有以下目錄結構:
ican/
__init__.py
haz/
__init__.py
apple.py
grape/
__init.py
grape.py
其中apple.py
和grape.py
有水果類定義。 在另一個測試文件中,我試圖通過類似於myapple = ican.haz.apple()
或mygrape = ican.haz.grape()
東西加載一個水果類。
加載這類類的正確目錄結構和import
結構是什么? 我也試過像import ican.haz as icanhaz
這樣import ican.haz as icanhaz
然后調用myapple = icanhaz.apple()
。 我希望將我的所有課程放在同一個地方並通過像ican.haz.<class>
這樣的東西加載它們。
你混淆了兩個概念。 python“module”是一個包含可以導入的python代碼的文件。 python“類”是可以在模塊中定義的東西。
在你的例子中, apple
和grape
是模塊。 您不能通過執行apple()
類的操作來調用模塊,這是不允許的。 您需要導入模塊中包含的類。
所以說apple.py
定義了一個GetApple
類。 所以apple.py
看起來像這樣:
class GetApple(object):
def __init__(self):
print("I have an apple!")
模塊也可以有函數,所以你可以改為使用GetApple
函數:
def GetApple():
print("I have an apple!")
模塊也可以有變量。 它們可以包含任意數量的變量,類和函數。 您可以單獨導入它們(例如from apple import GetApple
,或導入模塊並從模塊import apple
訪問它們。但是您無法導入然后調用模塊(至少不以任何合理的方式),只有函數或者里面的類。
對於您的目錄結構,您可以使用以下任何方法運行它:
>>> from ican.haz.apple import GetApple
>>> GetApple()
I have an apple!
>>> from ican.haz import apple
>>> apple.GetApple()
I have an apple!
>>> import ican.haz.apple
>>> ican.haz.apple.GetApple()
I have an apple!
並且,根據您的__init__.py
文件,可能還有:
>>> import ican.haz
>>> ican.haz.apple.GetApple()
I have an apple!
>>> import ican
>>> ican.haz.apple.GetApple()
I have an apple!
對於grape.py
,假設一個相應的類,這種事情會起作用:
>>> from ican.haz.grape.grape import GetGrape
>>> GetGrape()
I have a grape!
要均勻,要么
a) apple.py
應該在帶有init
的apple
文件夾中低一級,或者
b) grape.py
應該高一級,而不是在自己的grape
文件夾中。
然后你的導入將from ican.haz.apple import Apple
和from ican.haz.grape import Grape
(用於選項a); 或者from ican.haz import apple, grape
(選項b)。
要獲得所需的結構,請使用選項b並在haz
下修改init
。
haz/__init__.py
:
from .apple import Apple
from .grape import Grape
__all__ = ['Apple', 'Grape']
你會把它導入為import ican.haz.*
(雖然被認為是糟糕的風格)。 它是〜修改模塊與類名〜(自更正類名以來不再是)。 最好使用下面的一行,選項a或b。
順便說一句,根據您當前的結構進口需要:
from ican.haz import apple
from ican.haz.grape import Grape
a = apple.Apple()
g = Grape()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.