Python の属性探索順序: データディスクリプタがインスタンスの __dict__ に勝つ理由と __set_name__
obj.x はインスタンスの __dict__ より先にデータディスクリプタを見ます。__set__ か __delete__ の有無で決まる探索順序、cached_property が上書きされる理由、クラス作成後に追加したディスクリプタで __set_name__ が呼ばれない場合を整理しました。
Pythondescriptorattribute-lookupset-name