1

関数は使用する前に定義する必要がありますか? しかし、次のコードが機能する理由:

def main():
    dog()

def dog():
    print("This is a dog.")

if __name__ == '__main__':
    main()

つまり、dog() は呼び出された後に定義されますが、これはどのように機能しますか?

4

3 に答える 3

3

関数/メソッドのブロック内のコードは、関数が呼び出される前に実行されません。また、CPython 言語の実装 (これが最も一般的で、おそらく使用されているものです) は、C などの言語のようにコンパイル時に名前チェックを行いません。主にインタープリター言語であるため、名前が名前空間は実行時に動的に。

さらに、Python について知っておくべきことは、クラス内のコードはクラスの作成時に実行されますが、メソッド/関数内のコードは実行されないということです。defステートメントは、関数の名前を名前空間に追加するだけです。関数が呼び出されるまで、関数自体のコードは実行されません。

次の正当な Python コードを検討してください。

class Something:
    def __init__(self):
        self.puppy = Dog()

class Dog:
    def __init__(self):
        pass

inst = Something()

クラスが定義される__init__前に実行されないため、これは完全に合法です。Dogしかし、そのコンストラクターをクラス Dog の作成の上に移動するとどうなるでしょうか?

Dog がまだ定義されていないため、このコードは NameError について文句を言います。

class Something:
    def __init__(self):
        self.puppy = Dog()

inst = Something()

class Dog:
    def __init__(self):
        pass

最後の例...

このコードは、同じ NameError について文句を言います。

class Something:
    my_puppy = Dog()
    def __init__(self):
        self.puppy = Dog()

class Dog:
    def __init__(self):
        pass

inst = Something()

これは、内部のすべてのコードSomethingがすぐに実行され、実行のその時点で名前空間/スコープが name にアクセスできないためDogです。

于 2013-09-13T21:00:32.793 に答える