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

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

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

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

Q&A

3回答

716閲覧

__main__とは?

okahijiki

総合スコア404

Python

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

0グッド

1クリップ

投稿2019/07/08 01:49

Anaconda/JupyterNotebookを使用しております。

class Msg: pass msg=Msg msg _main__.Msg

この際の出力、_main__は、何が表現されているのでしょうか。
基本的に質問にて失礼。解説いただけると幸いであります。

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

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

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

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

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

guest

回答3

0

あるモジュールの名前空間は、そのモジュールが最初に import された時に自動的に作成されます。スクリプトの主モジュール (main module) は常に __main__ と呼ばれます。

4. 実行モデル — Python 3.7.4rc2 ドキュメント

 

__main__ はトップレベルのコードが実行されるスコープの名前です。モジュールが、標準入力から読み込まれたとき、スクリプトとして実行されたとき、あるいはインタラクティブプロンプトのとき、name には '__main__' が設定されます。
__main__ --- トップレベルのスクリプト環境 — Python 3.7.4rc2 ドキュメント


a.pyにHogeクラスのクラス定義を書いて、そちらからimportして同じことをすると<class 'a.Hoge'>と出てくるはずです。これはaという名前空間の中に定義されているHogeだ、ということを表します。同様に、直接実行されたモジュールはモジュールの名前ではなく__main__という名前の名前空間になる、ということです。

投稿2019/07/08 02:30

編集2019/07/08 02:52
hayataka2049

総合スコア30933

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

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

KSwordOfHaste

2019/07/08 02:51

自分の回答はもう少し「モジュールとは何か」にフォーカスして書くべきでしたね!
hayataka2049

2019/07/08 02:52

いえいえ、丁寧で親切な回答だと思います。
okahijiki

2019/07/08 07:04

ご回答、ありがとうございまーす。理解のために、もうしばらくお時間をください。
hayataka2049

2019/07/08 07:28

@質問者さん 了解です。
okahijiki

2019/07/10 03:27

ありがとうございまーす ! けっきょく、理解できなかった ...ということも十分ありますが、しばし、お時間をくださいませー。
hayataka2049

2019/07/10 03:45

私もpythonを触り始めてから2年くらいはこの辺りの事情についてまったく知らなかったので、時間をかけても大丈夫ですよ。いろいろやっていくうちに、そういうことなのかと納得できるようになります。 こちらのサイトがこういう言語仕様の基本的な部分をわかりやすく解説しています。 https://python.ms/
okahijiki

2019/07/10 09:10

貼っていただいたURLのサイト(mastering python)を読んでみました。 理解できないところが多々ありましたが、 「とても分かりやすく解説されている」感が伝わってくるサイトでした。 本件に関しては、こちらの知識不足ゆえ、限られた時間内ではクリアできませんでした。恐縮です。 どうぞ、宿題にさせてくださいませ。 また、あらたに違う角度から質問することもあるやに思います。 もし、偶然に、質問にてお会いする機会がありましたら、こりずに、お付き合い頂ければ幸いです。 いろいろ、寄り道したりして、とても勉強になりました。感謝ですー!
guest

0

そのクラス(Msg)を定義したモジュール名です。

Notebookでの記述(IPythonの入出力)を冗長な点を縮めて書くと次のようになるかと思います。

python

1In [1]: class Msg: 2 pass 3 4 Msg 5Out[1]: __main__.Msg

classを定義するとモジュール上にクラス名と同じ変数が生成され、その値が定義したクラスになります。上記で言えばMsgがそれです。

変数Msgに格納されているクラスは、Pythonの他のオブジェクトと同様いくつかの属性を持っています。

クラスの名前はMsg.__name__あるいはMsg.__qualname__のようにすると参照でき、本件の場合はどちらも'Msg'になります。またMsg.__module__にはそのクラスが定義されたモジュールの名前が格納されており本件の場合はメインモジュールであることを表す'__main__'がMsgクラスの「定義モジュール名」となります。IPythonの出力結果にある__main__はこの「定義モジュール名」を表しているのです。


もう少しいうと・・・

任意のオブジェクトをprint()関数で印字する場合、そのオブジェクトをstr()関数により文字列に変換したものが印字されます。本件の場合であれば<class '__module__.Msg'>が出力されます。

さてIPythonでは、わざわざprint(Msg)とせずとも、ただMsgとすればIPythonが自動的に結果の値の内容を印字してくれます。その際にはprint関数により印字するのではなく、オブジェクトの型に応じた特別な方法で文字列化したものを印字しているようで、型がtypeの場合(つまりクラスの場合)は単にクラスのモジュールとクラス名を連結したものになるようで、それがご質問にある__main__.Msgの正体です。

投稿2019/07/08 02:27

編集2019/07/08 04:57
KSwordOfHaste

総合スコア18394

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

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

okahijiki

2019/07/09 01:38

ご回答ありがとうございまーす! お返事、遅くなってしまいました。恐縮です。 まず、かんたんなモジュールを作ってみました。 #ファイル名 mylife.py #mylife.pyの中身 study='きょうもパイソン〜' food='きょうもカレー' def foo(): print('これはfoo関数なのだ') #Jupyter Notebookから実行 import mylife mylife.study 'きょうもパイソン〜' mylife.food 'きょうもカレー' mylife.foo() これはfoo関数なのだ #属性(ここの属する変数の名前?)一覧 dir(mylife) ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'foo', 'food', 'study'] ここまで理解できています。 本質問、クラスからインスタンス云々というのは、以上の理解が下支えになってくれそうな気がするのですが..この先、どのように「補助線」を引いていったら、よいのでしょうか。 お手数です。時間のあいた時にでも、お付き合いいただたら、幸いでーす。
KSwordOfHaste

2019/07/09 03:12

上記が「下支えになってくれる」とはちょっといいがたいかも知れません。クラスとインスタンスはもっと根源的な概念としてわきまえておくものと思います。 ただ、そのことを最初から把握できるかというとちょっと難しいかも知れません。またそれをわかりやすいようにかみ砕いて説明するのは意外に難しいです。 もしクラスとインスタンスの概念が漠然としているなら最初は次のように考えるとよいかも知れません。 (A)Pythonでは全ての値がインスタンス (B)インスタンスは何らかの型に属する。その型のことをクラスと呼ぶ。 (C)インスタンスは型(クラス)の実例と考えておくのがよいかも知れない。 1はintクラスの実例の一つ。2もそう。普通あるクラスの実例はいくらでも沢山考えられる。それらの実例のことを総称して「XXXクラスのインスタンスである」という言い方をする。 (A)で「全て」と言いましたがmylifeのようなモジュールもインスタンスです。その型はmoduleという名前のクラスです。 混乱を招くかも知れませんが、Msgのようなクラス自体もインスタンスであり、その型はtypeという名前のクラスです。「全ての値がインスタンス」であり「クラスも値」なので「クラスそのものもインスタンス」になるのです。 class Msg: ... class Student: ... こう定義したときMsgはクラス型のインスタンス、Studentもクラス型のインスタンスと考えられるわけです。 このあたりメタな概念を含むため短い日本語の説明ではうまく伝える自信がありませんが、もしクラスとインスタンスのことをつっこんで把握するならこうした事柄を(実際にコードを動かしたり調べたりしながら)よく考える必要があるでしょう。
okahijiki

2019/07/09 09:09

こちらに書くべき内容を、「解決解決方法(自己解決の場合のみ記入してください)」に書いてしまっていました。ご迷惑、おかけしております。あらためて、こちらに記述いたします。重複、ご容赦くださいませ。 ------ ご回答ありがとうございます。 こういうことは言えますでしょうか。 mylife.pyをインポートすると、コードが実行され、'foo','food','study'といった属性が作られる。 一方のclass Msgをインスタンス化すると、その際にも属性が作らせる。それと、件案のmainは、なんらかの関係があるというふうな...
KSwordOfHaste

2019/07/09 10:00

> 'foo','food','study'といった属性が作られる。 そのとおりですがその属性が作られる先がどこかがポイントです。 (1) まずmyfileという名前のモジュールインスタンスが作られ (2) そのモジュールインスタンスの属性としてfoo, food, studyが作られます。 > class Msgをインスタンス化すると、その際にも属性が作らせる。 なるべく詳しく言えば (1) まずクラスの実体が(typeクラスのインスタンスとして)作られる (2) そのクラス実体の属性__name__に'Msg'が設定される (3) そのクラス実体の属性__module__にそのクラスを定義したモジュールの名前が設定される。 上記(1)-(3)は class Msg:... と書かれたスクリプトを直接実行したりimportしたりする際に行われます。前者の場合(3)で'__main__'が設定され後者の場合は(3)でimportしたモジュールの名前(import mylifeとしたなら'mylife')になるのはhayataka2049さんの回答のとおりです。 モジュールとは何かは少々難しいですがhayataka2049さん回答にそれを理解するヒント(勉強すべきページ)が書いてあります。
okahijiki

2019/07/10 09:15

こちらの下地となる知識不足ゆえ、class Msgについて、(2)と(3)がクリアできませんでした(なんとなく、理解できる感じもあるのですが...)。どうぞ、本件は、宿題とさせてくださいませ。「コメント」と「解決方法を投稿する」を書きまちがえたり、ご迷惑もおかけしたりして。すこしずつ、慣れてまいりたいと存じます。ありがとうございましたー!
guest

0

ご回答ありがとうございます。
こういうことは言えますでしょうか。

mylife.pyをインポートすると、コードが実行され、'foo','food','study'といった属性が作られる。
一方のclass Msgをインスタンス化すると、その際にも属性が作らせる。それと、件案の__main__は、なんらかの関係があるというふうな...

投稿2019/07/09 05:33

okahijiki

総合スコア404

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

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

KSwordOfHaste

2019/07/09 09:00

回答欄には回答ないしは質問者さん自身での解決策を記述する欄であり、尋ねたいことを書いてはいけません。 上記の内容は「元の質問で尋ねようとしたことをより詳しく伝えようとしたもの」とみなしてよいと思うので、質問文の編集をするのがよいと思います。尋ねたかったことをより具体的に明確に記述するような変更なら質問文の編集はお勧めできます。 (ただし元の質問内容を大きく変えるような編集にならないようにご注意ください。質問内容があまり変わるようならむしろ新たに別の質問を挙げたほうがよいでしょう。)
okahijiki

2019/07/09 09:03

すみません、「回答に対するコメント欄」と書きまちがえてしまいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問