Anaconda/JupyterNotebookを使用しております。
class Msg: pass msg=Msg msg _main__.Msg
この際の出力、_main__は、何が表現されているのでしょうか。
基本的に質問にて失礼。解説いただけると幸いであります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
あるモジュールの名前空間は、そのモジュールが最初に import された時に自動的に作成されます。スクリプトの主モジュール (main module) は常に
__main__
と呼ばれます。
__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総合スコア30933
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総合スコア18394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/09 03:12
2019/07/09 09:09
2019/07/09 10:00
2019/07/10 09:15
0
ご回答ありがとうございます。
こういうことは言えますでしょうか。
mylife.pyをインポートすると、コードが実行され、'foo','food','study'といった属性が作られる。
一方のclass Msgをインスタンス化すると、その際にも属性が作らせる。それと、件案の__main__は、なんらかの関係があるというふうな...
投稿2019/07/09 05:33
総合スコア404
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/09 09:00
2019/07/09 09:03
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/08 02:51
2019/07/08 02:52
2019/07/08 07:04
2019/07/08 07:28
2019/07/09 15:50
2019/07/10 03:27
2019/07/10 03:45
2019/07/10 09:10