型アノテーションをつけると__init__で初期化できてなくてもインスタンス化できてしまう


型アノテーションによってエラーが出るタイミングが変わってしまいます。  
変数を宣言して初期化をしないクラスを定義します。Test2では型アノテーションだけ実施します。

[code]

    class Test1 :
        def __init__(self) :
            self.a = 1
            self.b
    
    class Test2 :
        def __init__(self) :
            self.a = 1
            self.b : int
    
[/code]

[code]

    >>> test1 = Test1()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 4, in __init__
    AttributeError: 'Test1' object has no attribute 'b'
    
[/code]

これは納得できるのですが

[code]

    >>> test2 = Test2()
    >>> test2.b
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Test2' object has no attribute 'b'
    
[/code]

ここで`test2.b`を参照するまでエラーが出ないのが不思議です。

[code]

    >>> vars(test2)
    {'a': 1}
    
[/code]

`test2.b`が存在しないのはわかるのですが、インスタンス化したときになぜエラーが表示されないのでしょう。




型アノテーションだけの行でエラーが起てしまうようだと「型アノテーションだけをする」というのが不可能になるからです。

* * *

(追記)  
PEP526に記載ありました。  
<https://www.python.org/dev/peps/pep-0526/#global-and-local-variable-
annotations>

> Being able to omit the initial value allows for easier typing of variables
> assigned in conditional branches:
[code]

    sane_world: bool
    if 2+2 == 4:
        sane_world = True
    else:
        sane_world = False
    
[/code]

> Omitting the initial value leaves the variable uninitialized:
[code]

    a: int
    print(a)  # raises NameError
    
[/code]

