Articles

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.

eksempel: offentlige attributter

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.

eksempel: Adgang offentlige medlemmer

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.

eksempel: Beskyttede attributter

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:

eksempel: få adgang til beskyttede medlemmer

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.

eksempel: Beskyttede attributter

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.setterdecorator til en anden overbelastning afname()metode som ejendom setter metode. Nu er _name beskyttet.

eksempel: adgang beskyttede medlemmer

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.

annonce

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:

eksempel: Private attributter

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.')
eksempel:

Copy

eksempel:

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.

eksempel:

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++.