Der Inhalt, der in diesem Artikel mit Ihnen geteilt wird, befasst sich mit objektorientierten Zugriffsbeschränkungen für Python. Er hat einen gewissen Referenzwert.
Innerhalb der Klasse kann es Attribute und Methoden geben Externer Code kann Daten manipulieren, indem er Methoden für Instanzvariablen direkt aufruft und so die komplexe interne Logik verbirgt.
Nach der vorherigen Definition der Student-Klasse zu urteilen, kann externer Code jedoch immer noch die Namens- und Bewertungsattribute einer Instanz frei ändern:
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)) def get_grade(self): if self.score >=90: return 'A' elif self.score>=600: return 'B' else: return 'C' bart = Student('Boyuan Zhou',100) print(bart.score) bart.score=120 print(bart.score)
100 120
Wenn Sie den internen Code wünschen Attribute, die unterschiedlich sein sollen Für den externen Zugriff können Sie vor dem Namen des Attributs zwei Unterstriche __ hinzufügen. Wenn der Variablenname einer Instanz in Python mit __ beginnt, wird sie zu einem privaten Attribut (privat), auf das nur zugegriffen werden kann intern, nicht extern. Daher ändern wir die Student-Klasse:
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)) def get_grade(self): if self.__score >=90: return 'A' elif self.__score>=600: return 'B' else: return 'C'
改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了:
bart = Student('Boyuan Zhou',100) print(bart.__name)Traceback (most recent call last): File "F:/mycompany/mycompany/schooldemo.py", line 16, in <module> print(bart.__name) AttributeError: 'Student' object has no attribute '__name'
Dies stellt sicher, dass externer Code den internen Zustand des Objekts nicht nach Belieben ändern kann, sodass durch den Schutz Aufgrund von Zugriffsbeschränkungen ist der Code robuster.
Aber was ist, wenn der externe Code den Namen und die Punktzahl erhalten möchte? Sie können Methoden wie get_name und get_score zur Student-Klasse hinzufügen:
class Student(object): def __init__(self,name,score): self.__name = name self.__score = score def get_name(self): return self.__name def get_score(self): return self.__score bart = Student('Boyuan Zhou',100) print(bart.get_name()) #Boyuan Zhou
Was ist, wenn Sie zulassen möchten, dass externer Code die Punktzahl ändert? Sie können die set_score-Methode zur Student-Klasse hinzufügen:
class Student(object): def __init__(self,name,score): self.__name = name self.__score = score def get_name(self): return self.__name def get_score(self): return self.__score def set_score(self,score): self.__score=score
Sie fragen sich vielleicht, die ursprüngliche Methode kann direkt über bart.score = 59 geändert werden. Warum ist es so aufwändig, eine Methode zu definieren? Denn in der Methode können Sie die Parameter überprüfen, um die Übergabe ungültiger Parameter zu vermeiden:
class Student(object): def __init__(self,name,score): self.__name = name self.__score = score def get_name(self): return self.__name def get_score(self): return self.__score def set_score(self,score): if 0 <=score <= 100: self.__score=score else: raise ValueError('bad score')
Es ist zu beachten, dass Variablennamen in Python ähnlich wie __xxx___ sind, also doppelte Unterstriche, die mit beginnen und enden Ein doppelter Unterstrich sind spezielle Variablen, auf die direkt zugegriffen werden kann und die keine privaten Variablen sind. Daher können Variablennamen wie __name__ und __score__ nicht verwendet werden.
Manchmal sehen Sie einen Instanzvariablennamen, der mit einem Unterstrich beginnt, z. B. _name. Auf solche Instanzvariablen kann jedoch gemäß der Konvention zugegriffen werden, wenn Sie eine solche Variable sehen, was bedeutet: „Obwohl.“ Auf mich kann zugegriffen werden, bitte behandeln Sie mich als private Variable und greifen Sie nicht nach Belieben darauf zu.' nicht direkt zugegriffen werden kann, besteht darin, dass der Python-Interpreter die Variable __name extern in _Student_name ändert. Daher können Sie weiterhin über _Student_name auf die Variable __name zugreifen:
Es wird jedoch dringend empfohlen, dies nicht zu tun Verschiedene Versionen von Python-Interpretern können __name in unterschiedliche Variablennamen ändern.class Student(object): def __init__(self,name,score): self.__name = name self.__score = score def get_name(self): return self.__name def get_score(self): return self.__score def set_score(self,score): if 0 <=score <= 100: self.__score=score else: raise ValueError('bad score') bart = Student('Boyuan Zhou',100)print(bart._Student__name) print(bart.get_name()) #Boyuan Zhou #Boyuan Zhou
Verwandte Empfehlungen:
Das obige ist der detaillierte Inhalt vonObjektorientierte Zugriffsbeschränkungen für Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!