2017-01-26 13 views
2

私はPythonを初めて使いました。カスタムクラス内に外部モジュールやパッケージをインポートするのに苦労しています。 私は答えを見つけられませんでした。おそらく私が使った言葉は良いものではないからです。これは、基本的にはPythonのグローバルな理解を扱う初心者質問ですPythonカスタムクラスで外部ライブラリをインポートする方法

私は以下のクラスをしました:名「XL」はありませんdefined`です:私はこのクラス構造でインスタンスを作成する場合NameError私は `だ

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) 

`

self.xlとself.timeを使用すると機能しました。 私の質問は次のとおりです。

1)クラス内のモジュールをインポートするにはどうすればよいですか?

2)インスタンス変数を避けることはできますか?あなたのクラス定義の外の前にFIEの一番上にそれらをインポートしないのはなぜあなたの助けを

おかげで、

+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__の内部にインポートしてください。

あなたがインポートされたモジュールの参照が、それは、クラス定義内

関連する問題