pythonアクセス制限
2841 ワード
Classの内部には、属性とメソッドがあり、外部コードはインスタンス変数を直接呼び出す方法でデータを操作することができ、内部の複雑な論理を隠すことができます.
しかし、前述のStudioクラスの定義から、外部コードは、1つのインスタンスの
内部属性が外部からアクセスされないようにするには、属性の名前に2つの下線
変更後、外部コードについては変更はありませんが、
これにより、外部コードがオブジェクトの内部の状態を勝手に変更できないことが確保され、アクセス制限の保護によってコードがより丈夫になります.
しかし、外部コードがnameとscoreを取得する場合はどうしますか?Studentクラスに
外部コードのscoreの変更を許可する場合はどうしますか?Studioクラスに
なお、Pythonでは、変数名は
二重下線の先頭のインスタンス変数は、必ず外部からアクセスできないのではないでしょうか.実はそうではありません.
しかし、異なるバージョンのPython解釈器が
総じて言えば、Python自体はあなたが悪いことをするのを止めるメカニズムがなく、すべては自覚にかかっています.
転載先:https://www.cnblogs.com/ghgyj/p/3997580.html
しかし、前述のStudioクラスの定義から、外部コードは、1つのインスタンスの
name
、score
の属性を自由に変更することができる.>>> bart = Student('Bart Simpson', 98)
>>> bart.score
98
>>> bart.score = 59
>>> bart.score
59
内部属性が外部からアクセスされないようにするには、属性の名前に2つの下線
__
を付けることができます.Pythonでは、インスタンスの変数名が__
で始まると、プライベート変数(private)になり、内部のみアクセスでき、外部はアクセスできません.そのため、Studentクラスを変更します.class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print '%s: %s' % (self.__name, self.__score)
変更後、外部コードについては変更はありませんが、
.__name
と .__score
に外部からアクセスすることはできません.>>> bart = Student('Bart Simpson', 98)
>>> bart.__name
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'Student' object has no attribute '__name'
これにより、外部コードがオブジェクトの内部の状態を勝手に変更できないことが確保され、アクセス制限の保護によってコードがより丈夫になります.
しかし、外部コードがnameとscoreを取得する場合はどうしますか?Studentクラスに
get_name
およびget_score
を追加する方法:class Student(object):
...
def get_name(self):
return self.__name
def get_score(self):
return self.__score
外部コードのscoreの変更を許可する場合はどうしますか?Studioクラスに
set_score
メソッドを追加できます.class Student(object):
...
def set_score(self, score):
self.__score = score
bart.score = 59
を直接通っても修正できるのに、なぜ一つの方法を定義するのに苦労したのかと聞かれるかもしれません.メソッドでは、無効なパラメータが入力されないようにパラメータをチェックできます.class Student(object):
...
def set_score(self, score):
if 0 <= score <= 100:
self.__score = score
else:
raise ValueError('bad score')
なお、Pythonでは、変数名は
__xxx__
に類似しており、すなわち二重下線で始まり、二重下線で終わるのは特殊変数であり、特殊変数はprivate変数ではなく直接アクセス可能であるため、__name__
、__score__
のような変数名は使用できない._name
のような下線で始まるインスタンス変数名を見ることがあります.このようなインスタンス変数の外部にはアクセスできますが、約束された規定に従って、このような変数を見ると、「アクセスできますが、プライベート変数と見なして、勝手にアクセスしないでください」という意味です.二重下線の先頭のインスタンス変数は、必ず外部からアクセスできないのではないでしょうか.実はそうではありません.
__name
に直接アクセスできないのは、Pythonインタプリタが__name
変数を_Student__name
に変更したためであり、_Student__name
変数には__name
を介してアクセスすることができる.>>> bart._Student__name
'Bart Simpson'
しかし、異なるバージョンのPython解釈器が
__name
を異なる変数名に変更する可能性があるため、そうしないことを強くお勧めします.総じて言えば、Python自体はあなたが悪いことをするのを止めるメカニズムがなく、すべては自覚にかかっています.
転載先:https://www.cnblogs.com/ghgyj/p/3997580.html