Python-offentlige, beskyttede, Private medlemmer
klassiske objektorienterede sprog, såsom C++ og Java, styrer adgangen til klasseressourcer med offentlige, private og beskyttede søgeord. Private medlemmer af klassen nægtes adgang fra miljøet uden for klassen. De kan kun håndteres inden for klassen.
offentlige medlemmer
offentlige medlemmer (generelt metoder erklæret i en klasse) er tilgængelige uden for klassen. Formålet med samme klasse er forpligtet til at påberåbe sig en offentlig metode. Dette arrangement af private instansvariabler og offentlige metoder sikrer princippet om dataindkapsling.
Alle medlemmer i en Python-klasse er som standard offentlige. Ethvert medlem kan tilgås uden for klassemiljøet.
Copy
class Student: schoolName = 'XYZ School' # class attribute def __init__(self, name, age): self.name=name # instance attribute self.age=age # instance attribute
Du kan få adgang tilStudent
klassens attributter og også ændre deres værdier, som vist nedenfor.
Copy
>>> std = Student("Steve", 25)>>> std.schoolName'XYZ School'>>> std.name'Steve'>>> std.age = 20>>> std.age25
beskyttede medlemmer
beskyttede medlemmer af en klasse er tilgængelige fra klassen og er også tilgængelige for dens underklasser. Intet andet miljø er tilladt adgang til det. Dette gør det muligt at arve bestemte ressourcer i forældreklassen af barneklassen.
Pythons konvention om at gøre en forekomstvariabel beskyttet er at tilføje et præfiks _ (enkelt understregning) til det. Dette forhindrer effektivt adgang til det, medmindre det er inden for en underklasse.
Copy
class Student: _schoolName = 'XYZ School' # protected class attribute def __init__(self, name, age): self._name=name # protected instance attribute self._age=age # protected instance attribute
faktisk forhindrer dette ikke instansvariabler i at få adgang til eller ændre forekomsten. Du kan stadig udføre følgende handlinger:
Kopier
>>> std = Student("Swati", 25)>>> std._name'Swati'>>> std._name = 'Dipa'>>> std._name'Dipa'
Du kan dog definere en ejendom ved hjælp af property decorator og gøre den beskyttet, som vist nedenfor.
Copy
class Student:def __init__(self,name):self._name = name@propertydef name(self):return [email protected] name(self,newname):self._name = newname
ovenfor, @property decorator bruges til at lave name()
metode som Ejendom og@name.setter
decorator til en anden overbelastning afname()
metode som ejendom setter metode. Nu er _name
beskyttet.
Kopier
>>> std = Student("Swati")>>> std.name'Swati'>>> std.name = 'Dipa'>>> std.name'Dipa'>>> std._name # still accessible
ovenfor brugte vi std.name
ejendom til at ændre _name
attribut. Det er dog stadig tilgængeligt i Python. Derfor ville den ansvarlige programmør afstå fra at få adgang til og ændre instansvariabler forud for _
uden for sin klasse.
Private medlemmer
Python har ingen mekanisme, der effektivt begrænser adgangen til nogen instansvariabel eller metode. Python foreskriver en konvention om præfiksering af navnet på variablen / metoden med en enkelt eller dobbelt understregning for at efterligne opførelsen af beskyttede og private adgangsspecifikatorer.
den dobbelte understregning __
forud for en variabel gør den privat. Det giver et stærkt forslag om ikke at røre ved det uden for klassen. Ethvert forsøg på at gøre det vil resultere i en AttributeError:
Copy
class Student: __schoolName = 'XYZ School' # private class attribute def __init__(self, name, age): self.__name=name # private instance attribute self.__salary=age # private instance attribute def __display(self): # private method print('This is private method.')
Copy
Copy
>>> std = Student("Bill", 25)>>> std.__schoolNameAttributeError: 'Student' object has no attribute '__schoolName'>>> std.__nameAttributeError: 'Student' object has no attribute '__name'>>> std.__display()AttributeError: 'Student' object has no attribute '__display'
Python udfører navn mangling af private variabler. Hvert medlem med en dobbelt understregning ændres til _object._class__variable
. Så det kan stadig fås uden for klassen, men praksis bør afvises.
Kopier
>>> std = Student("Bill", 25)>>> std._Student__name'Bill'>>> std._Student__name = 'Steve'>>> std._Student__name'Steve'>>> std._Student__display()'This is private method.'
Python giver således konceptuel implementering af offentlige, beskyttede og private adgangsmodifikatorer, men ikke som andre sprog som C#, Java, C++.
Leave a Reply