関数は使用する前に定義する必要がありますか? しかし、次のコードが機能する理由:
def main():
dog()
def dog():
print("This is a dog.")
if __name__ == '__main__':
main()
つまり、dog() は呼び出された後に定義されますが、これはどのように機能しますか?
関数/メソッドのブロック内のコードは、関数が呼び出される前に実行されません。また、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
です。