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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

4回答

4729閲覧

【Python】マングリングによるカプセル化は基本なのか

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2019/03/29 08:39

編集2019/03/29 12:39

Pythonでは、Javaなどと違って厳密なprivateは存在しませんよね。

ただ、マングリングによってそれらしく振る舞うことができますよね。

そこで質問です。実際のところ、マングリングが基本なのでしょうか?

カプセル化(ひいてはバグ防止)を意識するのであれば、マングリングが基本のように感じます。

でも、あまりそうした例を見ません。現場ではpublicとprivate(らしいもの)のどちらが基本ですか?

また、getter,setterに関しても同じことが言えますか?


追記

インスタンスメソッド、クラスメソッド、インスタンス変数、クラス変数のすべてに言えますか?


想像よりずっと多くの回答が得られ驚いてます。たくさんの回答ありがとうございました。

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

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

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

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

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

tachikoma

2019/03/29 09:00

“We are all (consenting) adults here.”
t_obara

2019/03/29 09:14

ドキュメント(https://docs.python.org/ja/3/tutorial/classes.html)に記載されているので、その前提でよろしいかと思いますが、「あまりそうした例をみません」とは、何を持ってそう感じたのか提示いただいた方が良いのではないかと思います。
退会済みユーザー

退会済みユーザー

2019/03/29 09:40

小さなソースばかり見ていてそう感じたのかもしれません。実際に仕事としてのソースだとどうなっているのか気になり質問しました。
guest

回答4

0

マングリングは、基本ではありません。

これは書籍 『Effective Python』Item 27: プライベート属性よりもパブラック属性を好む

に、その温度感が書かれています。著者は Google のエンジニアなので確かなはずです。

Python では、シングルアンダースコアが書かれたコードはたくさん見れますが

ダブルアンダースコア、マングリングを、期待したコードはあまり見ません。

なぜ Python では、このような文化なのかは、まだわかりませんが、「マングリングが基本」でないことは確かです。
*継承より合成ってなに?

投稿2019/03/29 10:56

nico25

総合スコア830

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

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

0

別の観点ですが、コードを書く時には補完機能を持ったものを使うことが多いと思います。その時にアンダースコアから始まるattributesはデフォルトで補完の候補に出てきません。それで十分なように感じます。

投稿2019/03/29 10:44

tachikoma

総合スコア3601

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

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

0

実際のところは__をつけるのすらだるいと考えるのか、_で済ませる実装にしているところが多いと思います。

我らがpandasで調べてみます。

python

1>>> import re, pandas as pd 2>>> for x in dir(pd.DataFrame()): 3... if re.search("^_[^_]", x): 4... print(x) 5... 6_AXIS_ALIASES 7_AXIS_IALIASES 8_AXIS_LEN 9_AXIS_NAMES 10_AXIS_NUMBERS 11_AXIS_ORDERS 12_AXIS_REVERSED 13_AXIS_SLICEMAP 14_accessors 15_add_numeric_operations 16_add_series_only_operations 17_add_series_or_dataframe_operations 18_agg_by_level 19_agg_doc 20_aggregate 21_aggregate_multiple_funcs 22_align_frame 23_align_series 24_apply_broadcast 25_apply_empty_result 26_apply_raw 27_apply_standard 28_at 29_box_col_values 30_box_item_values 31_builtin_table 32_check_inplace_setting 33_check_is_chained_assignment_possible 34_check_percentile 35_check_setitem_copy 36_clear_item_cache 37_clip_with_one_bound 38_clip_with_scalar 39_combine_const 40_combine_frame 41_combine_match_columns 42_combine_match_index 43_combine_series 44_combine_series_infer 45_compare_frame 46_compare_frame_evaluate 47_consolidate 48_consolidate_inplace 49_construct_axes_dict 50_construct_axes_dict_for_slice 51_construct_axes_dict_from 52_construct_axes_from_arguments 53_constructor 54_constructor_expanddim 55_constructor_sliced 56_convert 57_count_level 58_create_indexer 59_cython_table 60_deprecations 61_dir_additions 62_dir_deletions 63_drop_axis 64_ensure_valid_index 65_expand_axes 66_flex_compare_frame 67_from_arrays 68_from_axes 69_get_agg_axis 70_get_axis 71_get_axis_name 72_get_axis_number 73_get_axis_resolvers 74_get_block_manager_axis 75_get_bool_data 76_get_cacher 77_get_index_resolvers 78_get_item_cache 79_get_numeric_data 80_get_valid_indices 81_get_value 82_get_values 83_getitem_array 84_getitem_column 85_getitem_frame 86_getitem_multilevel 87_getitem_slice 88_gotitem 89_iat 90_iget_item_cache 91_iloc 92_indexed_same 93_info_axis 94_info_axis_name 95_info_axis_number 96_info_repr 97_init_dict 98_init_mgr 99_init_ndarray 100_internal_names 101_internal_names_set 102_is_builtin_func 103_is_cached 104_is_cython_func 105_is_datelike_mixed_type 106_is_mixed_type 107_is_numeric_mixed_type 108_is_view 109_ix 110_ixs 111_join_compat 112_loc 113_maybe_cache_changed 114_maybe_update_cacher 115_metadata 116_needs_reindex_multi 117_obj_with_exclusions 118_protect_consolidate 119_reduce 120_reindex_axes 121_reindex_axis 122_reindex_columns 123_reindex_index 124_reindex_multi 125_reindex_with_indexers 126_repr_data_resource_ 127_repr_fits_horizontal_ 128_repr_fits_vertical_ 129_repr_html_ 130_repr_latex_ 131_reset_cache 132_reset_cacher 133_sanitize_column 134_selected_obj 135_selection 136_selection_list 137_selection_name 138_series 139_set_as_cached 140_set_axis 141_set_axis_name 142_set_is_copy 143_set_item 144_set_value 145_setitem_array 146_setitem_frame 147_setitem_slice 148_setup_axes 149_shallow_copy 150_slice 151_stat_axis 152_stat_axis_name 153_stat_axis_number 154_take 155_to_dict_of_blocks 156_try_aggregate_string_function 157_typ 158_unpickle_frame_compat 159_unpickle_matrix_compat 160_update_inplace 161_validate_dtype 162_values 163_where 164_xs 165

どうせ「紳士協定」なので、面倒くさくなる__はほとんど見かけない印象があります。

なので、

現場ではpublicとprivate(らしいもの)のどちらが基本ですか?

に対しては「(命名規則でprivate的に扱うと決めているだけの)publicが基本」と答えるべきかもしれません。

投稿2019/03/29 09:37

編集2019/03/29 09:46
hayataka2049

総合スコア30939

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

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

LouiS0616

2019/03/29 09:52

PEP8の『Generally, double leading underscores should be used only to avoid name conflicts with attributes in classes designed to be subclassed.』に従うならば、属性をprivate-likeにするためだけに __ を用いないのは妥当だと思います。
hayataka2049

2019/03/29 09:58

あー、なるほど「疑似プライベート変数」ってそういう意味だったんですか。初めて理解しました。(子クラスから見て)プライベートなんですね。
guest

0

ベストアンサー

private method

Python のライブラリのソースコードを見ると、公開して使ってもらうことを意図していない内部で使う関数は、_ から始まる名前を使う例をよく見ますね。

Keras の例
keras/callbacks.py

python

1 def _call_begin_hook(self, mode): 2 省略....

C++ のように private 修飾子などはないので、呼ぼうと思えば呼べてしまうわけですが、名前が _ から始まる関数というだけで内部で使っている関数だとわかるので、この命名規則で十分だと思います。

getter/setter

C++ のように set_hoge(), hoge() とアクセサを用意してもよいですが、@property デコレータを使うと、C# の プロパティ と同じようなことができます。

python property - Qiita

python

1class A(object): 2 def __init__(self, val): 3 self._prop = val 4 5 @property 6 def prop(self): 7 return self._prop 8 9obj = A(10) 10print(obj.prop) 11 12obj.prop = 10 # AttributeError: can't set attribute

numpy の例

python

1import numpy as np 2a = np.array([1, 2, 3]) 3 4print(a.ndim) # 1 5 6a.ndim = 2 7# AttributeError: attribute 'ndim' of 'numpy.ndarray' objects is not writable

追記

インスタンスメソッド、クラスメソッド、インスタンス変数、クラス変数のすべてに言えますか?

言えると思います。
例えば、有名なライブラリ requests のソースを見ると、 公開する意図がない関数、Attributeは _ を先頭に付けた名前にしてますね。

requests/models.py at master · kennethreitz/requests

質問に対する回答まとめ

実際、private な関数、Attribute は先頭を _ から始めるという命名規則で十分ソースコードの品質を担保できると思います。
上記のルールは言語仕様のような絶対的なものではなく、大事なのは、1つのルールを決めてコードを書くことです。
コードを書くのが一人にしろ、複数にしろ、ルールを決めて、統一することが大事です。

投稿2019/03/29 09:04

編集2019/03/29 12:36
tiitoi

総合スコア21960

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問