質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3691閲覧

pythonの__file__について

roku28632

総合スコア36

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/01/07 11:05

編集2020/01/07 11:10

ドキュメントを見てもいまいちわからなかったので教えてください。
見たドキュメント
https://docs.python.org/ja/3/reference/datamodel.html#special-method-names

ググったりしていると、____hoge____などの、アンダースコア2つで囲まれたものはpythonでは、特殊メソッドという回答がありました。

https://teratail.com/questions/167513

知りたいのは、「file」についてですが、
これは、____file____も同じで、「特殊メソッド」という認識でよいでしょうか。

見た目的になんとなく、定数(変数)のような気がするのですが、
実際は file() というような感じで()が省略されたメソッドということでよいのでしょうか。

ドキュメントには、「定義済みモジュール」という記載もありますが、文字列がアンダースコア2つで囲まれたものは、定義的には「特殊メソッド」ということでよいでしょうか。
(この手のドキュメントは英文の翻訳なので、記述が曖昧な気がします。)

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ググったりしていると、__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__は、

  1. 関数でない
  2. クラスの中で定義されていない

という2重の意味でメソッドではありえません。

投稿2020/01/08 00:54

編集2020/01/09 12:52
quickquip

総合スコア11029

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

roku28632

2020/01/09 11:01

こんにちわ。 回答ありがとうございます。 自分でも色々調べてみてます。 いただいた回答を自分なりに理解すると、 つまり、__file__は「Pythonの処理系が内部処理のため付けた名前の一つ」ということになるかと思います。 また、他の方の回答を見ると、「特殊属性」とあります。 ググると属性は「オブジェクトに存在する変数やメソッドのこと」とあります。 https://programming-study.com/technology/python-attributes-dynamically/ では、__file__は、変数なのでしょうか。メソッドなのでしょうか。 pythonではメソッドを変数に代入することが可能だと思います。 ここには__file__は特殊なグローバル変数だという記述があります。 https://docs.python.org/ja/3/library/runpy.html __file__は「モジュールがロードされた絶対パスを返す」ので、 自分の理解では、「モジュールがロードされた絶対パスを返す」関数を参照する、グローバル変数という理解です。 あと、変数なのか関数なのか調べれないかと、こんな感じに実行してみると print(type(__file__)) 、string型だということもわかりました。 ちょっと周辺知識が怪しいので、ずばり、 __file__は、「」だ。という回答がいただきたいです。 よろしくお願いします。
roku28632

2020/01/11 05:15

詳しく書いていただきありがとうございます。 なかなか自分には難しい話なので、調べながら読ましていただいて理解を深めようと思います。 一番知りたかった__file__が何者なのかはなんとなくですがわかった気がします。
guest

0

ドキュメントに「特殊属性」と書いてあります。
質問の最初に書いてある見たドキュメントの中で「特殊属性」を検索してみてください。

投稿2020/01/07 11:26

編集2020/01/08 02:12
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問