クラス内にはプロパティとメソッドを含めることができ、外部コードはインスタンス変数メソッドを直接呼び出すことでデータを操作できます。複雑な内部ロジックが隠されています。
Teacher クラスの定義を見る、外部コードは引き続きインスタンスの名前とスコア属性を自由に変更できます。
class Teacher(object): def __init__(self, name, score): self.name = name self.score = score def print_score(self): print('%s: %s' % (self.name, self.score)) def get_grade(self): if self.score >= 90: return 'A' elif self.score >= 60: return 'B' else: return 'C' bart = Teacher('Bart Simpson', 98) lisa = Teacher('Lisa Simpson', 87) bart.score = 59 print(bart.score) print('bart.score =', bart.score)
実行結果:
もしよろしければ属性には外部からアクセスできません。属性名の前に 2 つのアンダースコアを追加できます。
Python では、インスタンスの変数名が で始まる場合、それはプライベート変数 (private) になります。は内部からのみアクセスでき、外部からはアクセスできません。したがって、Teacher は Teacher クラスを変更します: class Teacher(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 = Teacher('Bart Simpson', 98) print(bart.__name)
注:
就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。
但是如果外部代码要获取name和score怎么办?可以给Teacher类增加get_name和get_score这样的方法:
class Teacher(object): def get_name(self): return self.__name def get_score(self): return self.__score
如果又要允许外部代码修改score怎么办?可以再给Teacher类增加set_score方法。
class Teacher(object): def set_score(self, score): self.__score = score
原先那种直接通过bart.score = 59也可以修改啊,为什么要定义一个方法大费周折?因为在方法中,可以对参数做检查,避免传入无效的参数:
class Teacher(object): def set_score(self, score): if 0 <= score <= 100: self.__score = score else: raise ValueError('bad score')
在Python中,变量名类似xxx的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用name、score这样的变量名。
Teacher会看到以一个下划线开头的实例变量名。
比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当Teacher看到这样的变量时。
print(bart._Teacher__name)
代码解析:
双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问name是因为Python解释器对外把name变量改成了_Teacher_name。
所以,仍然可以通过_Teacher_name来访问__name变量。
“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
この記事は、パイソン。クラスに変数アクセス制限を導入しました。事例分析を通じて、実務での注意点や課題を解決する効果的な解決策をご提案します。
以上がPython のアクセス制限について説明する記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。