Pythonでは、Javaなどと違って厳密なprivateは存在しませんよね。
ただ、マングリングによってそれらしく振る舞うことができますよね。
そこで質問です。実際のところ、マングリングが基本なのでしょうか?
カプセル化(ひいてはバグ防止)を意識するのであれば、マングリングが基本のように感じます。
でも、あまりそうした例を見ません。現場ではpublicとprivate(らしいもの)のどちらが基本ですか?
また、getter,setterに関しても同じことが言えますか?
追記
インスタンスメソッド、クラスメソッド、インスタンス変数、クラス変数のすべてに言えますか?
想像よりずっと多くの回答が得られ驚いてます。たくさんの回答ありがとうございました。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/29 09:14

退会済みユーザー
2019/03/29 09:40

回答4件
0
マングリングは、基本ではありません。
これは書籍 『Effective Python』Item 27: プライベート属性よりもパブラック属性を好む
に、その温度感が書かれています。著者は Google のエンジニアなので確かなはずです。
Python では、シングルアンダースコアが書かれたコードはたくさん見れますが
ダブルアンダースコア、マングリングを、期待したコードはあまり見ません。
なぜ Python では、このような文化なのかは、まだわかりませんが、「マングリングが基本」でないことは確かです。
*継承より合成ってなに?
投稿2019/03/29 10:56
総合スコア830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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総合スコア30939
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/29 09:52

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
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総合スコア21960
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。