ググったりしていると、__hoge__などの、アンダースコア2つで囲まれたものはpythonでは、特殊メソッドという回答がありました。
そんな回答は付いていません。誤読しているだけです。
特殊メソッドの定義はここですね。
"特殊メソッドにはメソッド名の最初と最後にアンダースコア2つがついている"と書かれていますが、これを"メソッド名の最初と最後にアンダースコア2つがついているなら特殊メソッド"と誤読してはいけません。論理包含を間違えています。
(余談: この手の論理包含が理解できないようだとプログラミングは大変でしょう)
アンダースコア2つで囲まれた属性は単に「_が2つ前後についた名前」の属性でしかありません。
「_が2つ前後についた名前」の属性の中で、いくつかのものがメソッドであって、さらにその中のいくつかのものが "特殊な構文 (算術演算や添え字表記、スライス表記など) による特定の演算を実装" するために用意されていて、それらだけを特殊メソッドと呼んでいます。
「_が2つ前後についた名前」はPythonの処理系が内部処理のために付けるものという約束があるだけです。
(だからPythonの組み込みのもの以外にそんな名前を付けるなよ、ということになっている)
特殊メソッド以外の「_が2つ前後についた名前」に特別な名前が付いているわけではないです。
__file__
は、「」だ。という回答がいただきたいです。
__file__
は「モジュールが持つ属性」あるいは「モジュールに必ず定義されているグローバル変数」です。
それ以上でもそれ以下でもなく(Pythonから見たら)特別な何かではありません。
"特殊属性"は用語ではないと思っています。
用語として扱われることもままありますが、定義なんてなくて、「これらは特殊な属性です」とドキュメントに列挙され書かれたものがただ"特殊属性"と呼ばれているのではないでしょうか。
例えば、ドキュメントに「特殊な文法」とか「特殊文字」とか「特殊な例外処理」とかいう表現が登場しますが、
「特殊文法」とか「特殊文字」とか「特殊例外処理」が用語ですか? と言ったら違うでしょう。
「__file__
はモジュールの特殊な属性です」という説明は正しいと思います。
でもそれは「モジュールが持つ属性の中でもこれは特別なのですよ」と言っているだけで、「特殊な属性」が何か定義がある用語だとは思いません。
では、__file__
は、変数なのでしょうか。メソッドなのでしょうか。
実のところPythonの実行モデルには「変数」という概念はありません。
あるのは「名前空間」と「名前」です。
(言語リファレンスに変数という項目がありません。あるのは"名前づけと束縛 (naming and binding)"です。完全な文法仕様にvariableがありません。nameです)
モジュールが持つ名前空間に束縛された名前のことを便宜上"グローバル変数"と呼んでいます。
関数を実行したときにできる名前空間に束縛された名前のことを便宜上"ローカル変数"と呼んでいます。
クラスが持つ名前空間に束縛された名前のことを便宜上"クラス変数"と呼んでいます。
インスタンスが持つ名前空間に束縛された名前のことを便宜上"インスタンス変数"と呼んでいます。
ここには__file__
は特殊なグローバル変数だという記述があります。
その通りです。"モジュールに束縛された名前"ですから、それをグローバル変数と呼ぶのは合ってます。
変数なのか関数なのか調べれないかと
この2つは対立概念にはなりません。
変数なのか? という問いはそれが名前かどうかに依ります。つまり__file__
が名前かどうか? という話です。
関数なのか? という問いはオブジェクトが関数かどうか(functionクラスのインスタンスか)に依ります。つまり__file__
という名前で参照されるオブジェクトが関数かどうか? という話です。
属性は ここに定義がありますね。
"オブジェクトに関連付けられ、ドット表記式によって名前で参照される値"が属性です。
__file__
という名前はモジュールに定義された名前(=グローバル変数)で、モジュールに定義された名前は属性としてアクセスできます。
モジュール名.__file__
という名前でアクセス可能なので、__file__
は"モジュールの属性"です。
メソッドは ここに定義がありますね。
"クラス本体の中で定義された関数"がメソッドです。__file__
は、
- 関数でない
- クラスの中で定義されていない
という2重の意味でメソッドではありえません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/09 11:01
2020/01/11 05:15