2017-01-26 66 views
2

我是Python的新手,我正在努力導入自定義類中的外部模塊/包。 我沒有找到答案(可能是因爲我使用的術語不好),所以我張貼在這裏。它基本上是處理與Python全球理解的新手問題如何在Python自定義類中導入外部庫

我有下面的類:

class MyCustomClass: 
    import openpyxl as xl 
    from fuzzywuzzy import fuzz 
    from fuzzywuzzy import process 
    import time 

    def __init__(self, file_path): 
    self.file = xl.load_workbook(file_path) 

    def some_method(self): 
    start = time.time() 
    process.extractOne(#calling args) 

當我創建一個實例與此類結構我`NameError:名字「XL」不是defined` `

它在使用self.xl和self.time時有效。 這裏是我的問題:

1)在我的課堂上導入模塊或包的好方法是什麼?

2)我可以避免讓他們的實例變量?

感謝您的幫助,

+1

雖然我不是爲什麼這個工程openpyxl但不是時間完全肯定,我只想補充一點情況並不少見把你的自定義類作爲自己的模塊,這樣在你的主腳本中你可以調用'from(filename)import MyCustomClass'。這限制了你的導入範圍,所以你不必擔心命名空間而不要求它們在你的對象的構造函數 – Aaron

回答

2

具有類定義中的進口使得可作爲類的名字成員:

>>> class Example: 
     import time 

>>> Example.time 
<module 'time' (built-in)> 

因此爲了訪問來自內部的進口,你將不得不把它們稱爲使用MyCustomClass.xl.load_workbook類成員。

一般來說,這是不鼓勵的。這些導入不屬於類本身,它們是類的依賴關係,但沒有理由將這些依賴類作爲類成員公開。相反,你應該只導入這些名字外的類定義的

import openpyxl as xl 
from fuzzywuzzy import fuzz 
from fuzzywuzzy import process 
import time 

class MyCustomClass: 
    def __init__(self, file_path): 
     self.file = xl.load_workbook(file_path) 

    def some_method(self): 
     start = time.time() 
     process.extractOne(some_args) 
+0

中多謝@poke。我沒有意識到這可能會從外面下來,儘管它是有道理的。 – MaxDpt

+0

謝謝@Vlad也! – MaxDpt

0

爲什麼不能在你的類定義之外之前外商投資企業的進口頂級呢?或者,如果您確實希望這些導入程序非常本地化,請將其導入實際使用它們的__init__方法或方法中。

你正在做它的導入模塊引用的方式既不是在全球範圍內,也不在方法的局部範圍,這就是爲什麼它不工作