簡體   English   中英

Python模塊與類

[英]Python modules vs classes

我有以下目錄結構:

ican/
  __init__.py
  haz/
    __init__.py
    apple.py
    grape/
      __init.py
      grape.py

其中apple.pygrape.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“類”是可以在模塊中定義的東西。

在你的例子中, applegrape是模塊。 您不能通過執行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應該在帶有initapple文件夾中低一級,或者

b) grape.py應該高一級,而不是在自己的grape文件夾中。

然后你的導入將from ican.haz.apple import Applefrom 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.

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