pythonアクセス制限

2841 ワード

Classの内部には、属性とメソッドがあり、外部コードはインスタンス変数を直接呼び出す方法でデータを操作することができ、内部の複雑な論理を隠すことができます.
しかし、前述のStudioクラスの定義から、外部コードは、1つのインスタンスのnamescoreの属性を自由に変更することができる.
>>> 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