2017-08-30 6 views
5

私はその完全修飾名を参照することによって、それをインポートせずに、クラスやメソッドを呼び出すことができます。完全修飾名を使用してPythonメソッドを呼び出す方法は? Javaでは

public class Example { 
    void example() { 

     //Use BigDecimal without importing it 
     new java.math.BigDecimal(1); 
    } 
} 

同様の構文は、明らかにパイソンを使用して動作しません。

class Example: 
    def example(self): 

     # Fails 
     print(os.getcwd()) 

グッドプラクティスとPEP勧告を除いて、私はPythonで同じことをすることはできますか?

+1

いいえ、クラスやメソッドをインポートせずに呼び出すことはできません。なぜ、インポートを避けたいのですか? PythonでJavaライナーを2行に変更するだけで、関数内でローカルにインポートすることができます。それはあなたが避けようとしている唯一のものですか? – mgilson

+0

私はいくつかのASTベースのコードインジェクションで遊んでいるので、私はワンライナーを気に入っています。元のモジュールをできるだけ修正したくはありません – noamt

答えて

2

定義が実行されるまで関数が存在しません。つまり、モジュールが実行されていることを意味します(直接実行したスクリプトでない限り)。

私が考えることのできる最も近いものはprint(__import__('os').getcwd())です。

+0

この場合、 '__import()__'が完全に動作するようです – noamt

+1

@noamt実際、あなたは本当に '__import__'を使うべきではありません。そのようなものを望むなら、 'importlib.import_module'を使います。 –

+0

'__import__'または' importlib'はクラス名を持つ完全修飾パスを扱いますか?例えば'module.OuterClass.InnerClass.some_classmethod'? – mgilson

1

私はあなたが正確に同じことを行うことができることをわからないんだけど、あなたは機能のみをインポートすることができます。

foo.barは機能が含まれており、 bazがあるモジュールの完全修飾名です
from foo.bar import baz as baz_fn 

baz_fn() 

インポートする関数の名前。それは名前baz_fnとしてそれをインポートします。

2

いいえモジュールをPythonで使用する場合は、その名前をスコープに明示的にインポートする必要があります。そして、@AlexHallが述べたように、クラス/関数/モジュールは存在しませんまでまでのインポート時間。 import -ingなしでアクセスする方法はありません。しかし、私の意見では、これはより明快なコードのためになります。これにより、モジュール名をインポートするときに明示的に指定する必要があります。

関連する問題