Innerhalb einer Klasse können Eigenschaften und Methoden vorhanden sein, und externer Code kann Daten manipulieren, indem er Instanzvariablenmethoden direkt aufruft und so die komplexe interne Logik verbirgt.
Nach der Definition der Teacher-Klasse zu urteilen, kann externer Code den Namen und die Bewertungsattribute einer Instanz immer noch frei ändern.
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)
Laufergebnis:
Wenn Sie verhindern möchten, dass von außen auf interne Attribute zugegriffen wird, können Sie vor dem Namen des Attributs zwei Unterstriche hinzufügen.
Wenn in Python der Variablenname einer Instanz mit beginnt, wird sie zu einer privaten Variablen (privat), auf die nur intern und nicht extern zugegriffen werden kann :
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变量。
“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
Dieser Artikel basiert auf Python-Grundlagen. Einführung von Zugriffsbeschränkungen für Variablen in Klassen. Durch Fallanalysen bieten wir wirksame Lösungen für die Punkte, die in der praktischen Anwendung Aufmerksamkeit erfordern, und für die aufgetretenen Probleme.
Das obige ist der detaillierte Inhalt vonEin Artikel, der Sie über Python-Zugriffsbeschränkungen informiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!