2016-10-09 4 views
1

今日、私は、ProtectedメンバークラスがPythonにあるかどうか尋ねました。多くの人が、PublicProtectedまたはPrivateのようなものはないと言っていました。まだ10だったので、これは私が変わっしかしPrivate、のようなものです実際にはPythonでカプセル化されていません

car = Vehiculo(10) 
car.__peso = 20 

とそれが印刷された:しかし、私はこれをテストするために、次のコード製:

class Vehiculo(): 

    def __init__(self, peso): 
     self.__peso = peso 

をし、私がやった外部クラスから1つの下線付きのクラス変数:

class Vehiculo(): 

     def __init__(self, peso): 
      self._peso = peso 

代わりに20が表示されます。誰かが私にこのことを明確に説明することはできますか?私は非常によく似た投稿を読んだことがあるが(多くは重複していると思う)、私は彼らの言うことを理解していない。これはまさにPublicPrivateです。そして、私はProtectedの振る舞いをする方法、あるいはそれが可能であるかどうかを知りたいと思います。

ありがとうございました。

答えて

2

Pythonクラスではpublic、private、protectedのようなものはありません。プライベートなメソッドと値の前には、通常、直接アクセスしないように他の開発者にヒントするための接頭辞としてアンダースコアが付いています(_)。しかし、単にそれらのメンバーにアクセスすることを妨げるメカニズムはありません。

二重アンダースコア規約(__init____lt__など)は、通常、特定のモジュールレベルまたはクラスレベルの変数を設定するためにPython自身によって使用されます。これらは、時には"magic methods"と呼ばれます。

+0

私が述べたように、私はいくつかのテストを行い、二重下線は、私がセッター機能を使用しない限り、他のモジュールまたはクラスからその変数にアクセスさせることはできませんでした.... – Wrong

+0

あなたはダブルアンダースコア値。おそらくあなたは間違ってそれにアクセスしていたでしょう。 – Soviut

+0

私はそれが正しいと確信しています...多分それはPythonのverisonと関係がありますか?私は3.5.2を使用しています – Wrong

1

二重アンダースコアの接頭辞が付いた属性はマングルされていますが、プライベートではありません。あなたはまだcar._Vehiculo__peso = 20を実行することができ、それは "private"変数を正常に設定します。

+0

私はそれを試して、それは変更されませんでした – Wrong

+0

それからあなたは別の何かをしました。 – Matthias

関連する問題