クラスでインスタンス変数をインスタンス化してから参照できない、見えないようにしたいのですが
Pythonにそのような機能はありますか?
実装方法を教えて下さい
class Test: def __init__(self,test): self.test = test self.debug = 1 ←debug用なのでインスタンス化したものから参照とアクセスできないようにしたい
t=Test("test") t.test←これはOK t.debug←これアクセスと外から見れないようにしたい
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
概要
Java の protected に該当するものは、
変数名の先頭にアンダーバーを1つ付けます。
_debug
Java の private に該当するものは、
変数名の先頭にアンダーバーを2つ付けます。
__debug
文化
GitHub などに転がっている Python のコードを読むと、
__debug
がほとんど無く _debug
であることに気づきます。
通常、フェールセーフに倒したいところですが、このような文化です。
温度感については、以下の書籍に記述されています。
- 書籍 Effective Python - 項目 27:プライベート属性よりはパブリック属性が好ましい
なぜ、このような文化なのか、わからないのですが。
恐らく Python が作られた当初は継承が危険であることがわからなかったからだと思います。
詳細
python
1# グローバルスコープ 2# グローバル変数 3_val1 = 1 # protected 4# __val2 = 10 # private 5""" 6# 参照 7できない 8# 説明 9モジュールを import しても 10この変数 _val1, __val2 は import されません。 11""" 12 13 14class Person(object): 15 # ローカルスコープ(クラス) 16 # ローカル変数 17 # クラス変数 18 _val3 = 100 # protected 19 """ 20 # 参照 21 obj._val3 22 # 機能 23 無。命名規則です。 24 """ 25 26 __val4 = 1000 # private 27 """ 28 # 参照 29 Person._Person__val3 30 # 機能 31 Person.__val4 では参照できない。 32 Person._Person__val4 として参照します。 33 # いつ使うの? 34 他のクラスから継承されたときに 35 名前が上書きされてしまうのを避けるため。 36 """ 37 38 def func(self): 39 # ローカルスコープ(関数) 40 # ローカル変数 41 # インスタンス変数 42 self._val5 = 1000 43 self.__val6 = 10000 44 """ 45 # 参照 46 # 機能 47 # いつ使うの? 48 ローカルスコープ(クラス)で定義されたクラス変数と同じ 49 """
投稿2019/10/30 10:18
総合スコア830
0
ベストアンサー
Pythonにそのような機能はありますか?
無いです。
しかし、慣習的にはアンダースコア始まりの変数を使ってprivateを表明することが多いです。
Python
1class Test: 2 def __init__(self,test): 3 self.test = test 4 self._debug = 1
外部から普通にアクセスできますが、開発環境に依っては警告を出してくれます。
なお一部で
『アンダースコア二個始まりの変数は外部から参照できない』という主張がありますが、根強い誤解です。
またネームマングリングの主目的は属性の衝突の防止です。
Generally, double leading underscores should be used only to avoid name conflicts with attributes in classes designed to be subclassed.
一般的には、アンダースコアを名前の先頭に二つ付けるやり方は、サブクラス化されるように設計されたクラスの属性が衝突したときに、それを避けるためだけに使うべきです。
引用元:
投稿2019/10/30 10:15
編集2019/10/30 10:44総合スコア35668
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。