暗黙の…

※4/15 追記

Python3 で導入されたとてもキモイ暗黙の __class__ 変数についてちょっと試した。


やっていること

  • メソッド内で super() を呼ぶ前に self を別の値にする
  • メソッド内で nonlocal __class__ して __class__ を書き換えた後に super() を呼ぶ

結果

$ python3 classtest.py
<class '__main__.Test'>
<class '__main__.Test'>
Traceback (most recent call last):
  File "/home/shoma/source/garbages/python/classtest.py", line 50, in catch
    f()
  File "/home/shoma/source/garbages/python/classtest.py", line 60, in <lambda>
    catch(lambda: a.call_with_otherself())
  File "/home/shoma/source/garbages/python/classtest.py", line 38, in call_with_otherself
    super()
TypeError: super(type, obj): obj must be an instance or subtype of type
called
10
Traceback (most recent call last):
  File "/home/shoma/source/garbages/python/classtest.py", line 50, in catch
    f()
  File "/home/shoma/source/garbages/python/classtest.py", line 65, in <lambda>
    catch(lambda: a.call_super())
  File "/home/shoma/source/garbages/python/classtest.py", line 22, in call_super
    super().test()
SystemError: super(): __class__ is not a type (int)

結果考察

以上から言えること

  • super() はやっぱり super(__class__, self) の省略
  • __class__ がある環境情報は全てのメソッドで同じものを持つ