回答編集履歴
5
追記
answer
CHANGED
@@ -39,7 +39,7 @@
|
|
39
39
|
「特殊文法」とか「特殊文字」とか「特殊例外処理」が用語ですか? と言ったら違うでしょう。
|
40
40
|
|
41
41
|
「`__file__`はモジュールの特殊な属性です」という説明は正しいと思います。
|
42
|
-
でもそれは「属性の中でもこれは特別なのですよ」と言っているだけで、「特殊な属性」が何か定義がある用語だとは思いません。
|
42
|
+
でもそれは「モジュールが持つ属性の中でもこれは特別なのですよ」と言っているだけで、「特殊な属性」が何か定義がある用語だとは思いません。
|
43
43
|
|
44
44
|
----
|
45
45
|
|
4
追記
answer
CHANGED
@@ -27,7 +27,7 @@
|
|
27
27
|
|
28
28
|
|
29
29
|
`__file__`は「モジュールが持つ属性」あるいは「モジュールに必ず定義されているグローバル変数」です。
|
30
|
-
それ以上でもそれ以下でもなく特別な何かではありません。
|
30
|
+
それ以上でもそれ以下でもなく(Pythonから見たら)特別な何かではありません。
|
31
31
|
|
32
32
|
----
|
33
33
|
|
3
追記
answer
CHANGED
@@ -19,4 +19,71 @@
|
|
19
19
|
「_が2つ前後についた名前」はPythonの処理系が内部処理のために付けるものという約束があるだけです。
|
20
20
|
(だからPythonの組み込みのもの以外にそんな名前を付けるなよ、ということになっている)
|
21
21
|
|
22
|
-
特殊メソッド以外の「_が2つ前後についた名前」に特別な名前が付いているわけではないです。
|
22
|
+
特殊メソッド以外の「_が2つ前後についた名前」に特別な名前が付いているわけではないです。
|
23
|
+
|
24
|
+
----
|
25
|
+
|
26
|
+
> `__file__`は、「」だ。という回答がいただきたいです。
|
27
|
+
|
28
|
+
|
29
|
+
`__file__`は「モジュールが持つ属性」あるいは「モジュールに必ず定義されているグローバル変数」です。
|
30
|
+
それ以上でもそれ以下でもなく特別な何かではありません。
|
31
|
+
|
32
|
+
----
|
33
|
+
|
34
|
+
"特殊属性"は用語ではないと思っています。
|
35
|
+
|
36
|
+
用語として扱われることもままありますが、定義なんてなくて、「これらは特殊な属性です」とドキュメントに**列挙され書かれたもの**がただ"特殊属性"と呼ばれているのではないでしょうか。
|
37
|
+
|
38
|
+
例えば、ドキュメントに「特殊な文法」とか「特殊文字」とか「特殊な例外処理」とかいう表現が登場しますが、
|
39
|
+
「特殊文法」とか「特殊文字」とか「特殊例外処理」が用語ですか? と言ったら違うでしょう。
|
40
|
+
|
41
|
+
「`__file__`はモジュールの特殊な属性です」という説明は正しいと思います。
|
42
|
+
でもそれは「属性の中でもこれは特別なのですよ」と言っているだけで、「特殊な属性」が何か定義がある用語だとは思いません。
|
43
|
+
|
44
|
+
----
|
45
|
+
|
46
|
+
> では、`__file__`は、変数なのでしょうか。メソッドなのでしょうか。
|
47
|
+
|
48
|
+
実のところPythonの実行モデルには「変数」という概念はありません。
|
49
|
+
あるのは「名前空間」と「名前」です。
|
50
|
+
([言語リファレンス](https://docs.python.org/ja/3.6/reference/index.html)に変数という項目がありません。あるのは"名前づけと束縛 (naming and binding)"です。[完全な文法仕様](https://docs.python.org/ja/3.6/reference/grammar.html)にvariableがありません。nameです)
|
51
|
+
|
52
|
+
モジュールが持つ名前空間に束縛された名前のことを**便宜上**"グローバル変数"と呼んでいます。
|
53
|
+
関数を実行したときにできる名前空間に束縛された名前のことを**便宜上**"ローカル変数"と呼んでいます。
|
54
|
+
クラスが持つ名前空間に束縛された名前のことを**便宜上**"クラス変数"と呼んでいます。
|
55
|
+
インスタンスが持つ名前空間に束縛された名前のことを**便宜上**"インスタンス変数"と呼んでいます。
|
56
|
+
|
57
|
+
> ここには`__file__`は特殊なグローバル変数だという記述があります。
|
58
|
+
|
59
|
+
その通りです。"モジュールに束縛された名前"ですから、それをグローバル変数と呼ぶのは合ってます。
|
60
|
+
|
61
|
+
----
|
62
|
+
|
63
|
+
> 変数なのか関数なのか調べれないかと
|
64
|
+
|
65
|
+
この2つは対立概念にはなりません。
|
66
|
+
|
67
|
+
変数なのか? という問いはそれが名前かどうかに依ります。つまり`__file__`**が**名前かどうか? という話です。
|
68
|
+
|
69
|
+
関数なのか? という問いはオブジェクトが関数かどうか(functionクラスのインスタンスか)に依ります。つまり`__file__`**という名前で参照されるオブジェクトが**関数かどうか? という話です。
|
70
|
+
|
71
|
+
----
|
72
|
+
|
73
|
+
属性は [ここ](https://docs.python.org/ja/3.6/glossary.html#term-attribute)に定義がありますね。
|
74
|
+
"オブジェクトに関連付けられ、ドット表記式によって名前で参照される値"が属性です。
|
75
|
+
|
76
|
+
`__file__`という名前はモジュールに定義された名前(=グローバル変数)で、モジュールに定義された名前は属性としてアクセスできます。
|
77
|
+
`モジュール名.__file__`という名前でアクセス可能なので、`__file__`は"モジュールの属性"です。
|
78
|
+
|
79
|
+
|
80
|
+
----
|
81
|
+
|
82
|
+
|
83
|
+
メソッドは [ここ](https://docs.python.org/ja/3.6/glossary.html#term-method)に定義がありますね。
|
84
|
+
"クラス本体の中で定義された関数"がメソッドです。`__file__`は、
|
85
|
+
|
86
|
+
1. 関数でない
|
87
|
+
1. クラスの中で定義されていない
|
88
|
+
|
89
|
+
という2重の意味でメソッドではありえません。
|
2
些細
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
> ググったりしていると、__hoge__などの、アンダースコア2つで囲まれたものはpythonでは、特殊メソッドという回答がありました。
|
2
2
|
|
3
|
-
そんな回答は付いていません。
|
3
|
+
そんな回答は付いていません。誤読しているだけです。
|
4
4
|
|
5
5
|
----
|
6
6
|
|
1
些細
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
> ググったりしていると、__hoge__などの、アンダースコア2つで囲まれたものはpythonでは、特殊メソッドという回答がありました。
|
2
2
|
|
3
|
-
そんな回答は
|
3
|
+
そんな回答は付いていません。(質問した人が誤読しているだけです)
|
4
4
|
|
5
5
|
----
|
6
6
|
|