なぜPythonの'民間のボックス内の検索フィールドは実際の個?
-
09-06-2019 - |
質問
Pythonに作成民間のボックス内の検索フィールドの変数内のクラスによるprependingダブルマイの名前のようになります: __myPrivateMethod()
.それでは、簡単に説明するこ
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
>>> obj.myPublicMethod()
public method
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
>>> obj._MyClass__myPrivateMethod()
this is private!!
も読みました。!
についてご説明させていただきこの少しの方から取得します。
>>> class MyClass:
... def myPublicMethod(self):
... print 'public method'
... def __myPrivateMethod(self):
... print 'this is private!!'
...
>>> obj = MyClass()
私たりをクラスとメソッドは、publicメソッドと専用手法やインスタンスを生成します。
次に、私はその公開方法です。
>>> obj.myPublicMethod()
public method
次に、どのように呼ぶそう方法です。
>>> obj.__myPrivateMethod()
Traceback (most recent call last):
File "", line 1, in
AttributeError: MyClass instance has no attribute '__myPrivateMethod'
も良さそうに見えることができいきます。では、実際には、'private'.もっともない。走 dir() のオブジェクトから新しい魔法のpythonを魔法のためのすべての"私"。
>>> dir(obj)
['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
この新しい方法の名前は常にアンダースコア、その後のクラス名、メソッド名です。
>>> obj._MyClass__myPrivateMethod()
this is private!!
多くのカプセル化eh?
る場合には、私も聞いたPythonをサポートしていない封止うものはなぜひ体験してみてください。を与えることで発生する?
解決
名前のスクランブリングをサブクラスでない偶然にオーバーライドは、privateメソッドや属性のスーパークラス.い防止のための検討からのアクセス。
例えば:
>>> class Foo(object):
... def __init__(self):
... self.__baz = 42
... def foo(self):
... print self.__baz
...
>>> class Bar(Foo):
... def __init__(self):
... super(Bar, self).__init__()
... self.__baz = 21
... def bar(self):
... print self.__baz
...
>>> x = Bar()
>>> x.foo()
42
>>> x.bar()
21
>>> print x.__dict__
{'_Bar__baz': 21, '_Foo__baz': 42}
もちろん、やりとりするいわゆる"クラウドが二つの異なるクラスが同じ名前です。
他のヒント
例民間機能
import re
import inspect
class MyClass :
def __init__(self) :
pass
def private_function ( self ) :
try :
function_call = inspect.stack()[1][4][0].strip()
# See if the function_call has "self." in the begining
matched = re.match( '^self\.', function_call )
if not matched :
print 'This is Private Function, Go Away'
return
except :
print 'This is Private Function, Go Away'
return
# This is the real Function, only accessible inside class #
print 'Hey, Welcome in to function'
def public_function ( self ) :
# i can call private function from inside the class
self.private_function()
### End ###
来た時からJavaへのPythonい 憎 ます。正直言って、かなり怖死しました。
今日でちょうどいつも一保堂茶舗東京丸の内店 私がこのウィークで最も好きな 約エラーになります。
愛していること、プラットフォームに人々が互いに信頼しないように感じ構築が必要不可解な壁近傍のコードです。強い内包された言語の場合には、インターコネクションバグを使用し、今何が間違っているのは、まだできない仕事なので、必要な方法です。Pythonの姿勢は:"る"と確信する。たくさんついてご理解いただけたでしょ状況は、おそらくまでも読んでみたい、ということができます"幸運を祈っています。".
この封止はも弱に関するセキュリティ確保の方策"と"ファイルを保存するディレーオフの芝生.でもパターンである必要があるコードベース分かりやすいものになりました。
から http://www.faqs.org/docs/diveintopython/fileinfo_private.html
厳密に言えば、民間の方法 アクセス以外のクラスは、 ないです。ものではない Pythonは本当に個人;内部的には、 の名の民間法 属性難号化したとunmangled そしていよう になれます。す アクセスできる__構文解析の方法 MP3FileInfoクラスの名前 _MP3FileInfo__解析.認めることは面白いと思うのですが、その約束 とは絶対にしていますので実際のコードです。Privateメソッドは個人のための そのような理由からどのようなもの Python、その【なさる】が 最終的にはベルのいない ます。
この言葉は一般的には"私たちは、すべての大人の同意します。によるprepending単一アンダースコア(かく)またはダブルアンダースコア(非表示)には、語は、ユーザのクラスまでの加するという形の"私的"もあります。しかし、信頼んの行動に責任を持ってを尊重することがないやむを得ない理由などデバッガ、コードを確認の上、お申し込みください.
ればなるものでは個きますので、その実践できるように拡張子(例えばCたCPython).ほとんどの場合、ただし、単身のPythonicうになっています。
しかできないファッションで若野が取得できなく周りの【なさる】の他の言語(ポインタを演算C++では、反射す。純/Java).
の点でエラーが出た場合には、民間法による事故。が撮影したい場合に自分の足で見ていて気分が良いものです。
編集:きない安全なものにOO-encapsulationい。
の class.__stuff
命名規約できるプログラマを知りたいようにアクセス __stuff
からです。その名の難号化では誰もいい。
True、まだできるところでもやその他の言語(ちなみにもできないこと)は、Pythonプログラマはこのた場合には利益ばかり考えて行動してい封止.
類似の行動が存在する場合モジュール属性の名前で始まりシングルアンダースコアなど_foo).
モジュール属性の名前などはコピーされませんへの輸入モジュール使用の場合 from*
の方法、例えば:
from bar import *
しかし、これはコンベンションではない言語に与えます。これらは個人の属性;できる植物の自家不和合性遺伝子機能および操作者輸入業者.いこのため、Pythonで実装はtrue封止.
の一種ですので、その言語でデザインの選択肢です。一部レベルで正当化されます。彼らをなくして安心してご利用いただけからではのおみやメソッドを呼び出す必要はないが必要であれば、なかなか良い理由!
デバッグフックおよび試験を思い浮かべるかもしどで有用可能なアプリケーションの使用責任を持ってます。
Python3.4この挙動:
>>> class Foo:
def __init__(self):
pass
def __privateMethod(self):
return 3
def invoke(self):
return self.__privateMethod()
>>> help(Foo)
Help on class Foo in module __main__:
class Foo(builtins.object)
| Methods defined here:
|
| __init__(self)
|
| invoke(self)
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
>>> f = Foo()
>>> f.invoke()
3
>>> f.__privateMethod()
Traceback (most recent call last):
File "<pyshell#47>", line 1, in <module>
f.__privateMethod()
AttributeError: 'Foo' object has no attribute '__privateMethod'
https://docs.python.org/3/tutorial/classes.html#tut-private
この難号化ルールを設計主に万一の事故防止のために; だができるスタンス変数あると考えられる。 ここでも役に立つ特別な事情などのアンインストールします。
場合においても問題は古いですがどうぞよろしくお願いいたしのスニペットもご提供いただきました。
最も重要な懸念privateメソッドや属性について開発者なので外のクラスで封止.一つに誤解を与えるからセキュリティ封止.が故意に使用書式のように(下)また、たくない封止.
obj._MyClass__myPrivateMethod()
私からの移行C#、最初はとても私にとってもらったという考えのもとにのみのPythonコードのデザイナーが考えOOPは異なります。
なぜPythonの'民間のボックス内の検索フィールドは実際の個?
私の理解では、 できない きます。どうすればプライバシー施行?
その答えは、"個人会員のみアクセスすること self
"がんワーク self
は特別ではありませんPythonでは、このように一般的に使われる名前のパラメータの機能です。