PythonにはJavaのようなプライベートキーワードはありませんが、クラスのプライベート属性を定義することもできます。属性名を__fieldなどの__で始まるように変更するだけです。
サンプルコード:
classVector2D(object):
def __init__(self, x, y):
self.__x =float(x)
self.__y =float(y)
self.xx = x
self.yy = y
def get_x(self):return self.__x #内部アクセス
if __name__ =="__main__":
v =Vector2D(3,4)
print v.__dict__
print v._Vector2D__x, v.get_x()#しかし、あなたはvを渡すことができます._Vector2D__x外部アクセス
v.__x #外部アクセス
出力:
{' yy':4,'xx':3,'_Vector2D__x':3.0,'_Vector2D__y':4.0}3.03.0Traceback(most recent call last):...
v.__x
AttributeError:'Vector2D' object has no attribute '__x'
上記の例からわかるように:
__ フィールドはコンパイラによって_className__fieldに名前が変更されました
Obj .__ fieldはクラス外ではアクセスできませんが、クラス内でアクセスできます
ただし、これは不注意による呼び出しのみを防止でき、悪意のある呼び出しは防止できません。FluentPythonの言葉を借りれば、これはセキュリティデバイスではなく、安全デバイスです。マンダリンでは、objを渡すことができるため、紳士がxxを防ぐことができます。 ._className__fieldは、objのプライベート__fieldに外部からアクセスします。
補足知識:pythonのプライベート属性とプライベートメソッド、プライベート属性の値を変更する
属性が2つの下線で始まる場合、この属性がプライベート属性であることを示します
self.__money = 1000000
メソッドが2つの下線で始まる場合、それはプライベートであることも意味します
親クラスのプロパティがプライベートの場合、子クラスは親クラスを継承します。子クラスには継承されません。
クラスではプライベートプロパティとプライベートメソッドを使用できます
カスタムクラスの属性がプライベートの場合、クラス外で呼び出すことはできません
プライベート属性の値を変更する
オブジェクトの属性値を変更する必要がある場合、通常は2つの方法があります
オブジェクト名。属性名=データ—直接変更
オブジェクト名。メソッド名()---間接的な変更
プライベート属性には直接アクセスできないため、最初の方法で変更することはできません。通常、プライベート属性の値は、呼び出すことができるパブリックメソッドを定義し、このパブリックメソッドでアクセスして変更するという2番目の方法で変更します。
classPerson(object):
def __init__(self):
self.name ="シャオミン"
self.__age =20
# プライベートプロパティの値を取得します
def get_age(self):return self.__age
# プライベートプロパティの値を設定します
def set_age(self, new_age):
self.__age = new_age
# オブジェクトを定義する
p =Person()
# 私有財産を強制的に取得する
# すべてを擁護することは意識に依存します
print(p._Person__age)print(p.name)
# クラス外のオブジェクトのプロパティを取得したい
ret = p.get_age()print(ret)
# クラス外のオブジェクトのプライベートプロパティの値を変更したい
p.set_age(30)print(p.get_age())
上記のPythonでのプライベート属性の定義は、エディターによって共有されるすべてのコンテンツです。参照を提供したいと思います。
Recommended Posts