Articles

Python – offentliga, skyddade, privata medlemmar

klassiska objektorienterade språk, som C++ och Java, kontrollerar åtkomsten till klassresurser med offentliga, privata och skyddade nyckelord. Privata medlemmar i klassen nekas åtkomst från miljön utanför klassen. De kan endast hanteras inifrån klassen.

offentliga medlemmar

offentliga medlemmar (vanligtvis metoder som deklareras i en klass) är tillgängliga utanför klassen. Syftet med samma klass krävs för att åberopa en offentlig metod. Detta arrangemang av privata instansvariabler och offentliga metoder säkerställer principen om datakapsling.

alla medlemmar i en Python-klass är offentliga som standard. Alla medlemmar kan nås utanför klassmiljön.

exempel: publika attribut

kopiera

class Student: schoolName = 'XYZ School' # class attribute def __init__(self, name, age): self.name=name # instance attribute self.age=age # instance attribute

Du kan komma åt Studentklassens attribut och även ändra deras värden, som visas nedan.

exempel: Tillgång offentliga medlemmar

kopiera

>>> std = Student("Steve", 25)>>> std.schoolName'XYZ School'>>> std.name'Steve'>>> std.age = 20>>> std.age25

skyddade medlemmar

skyddade medlemmar i en klass är tillgängliga från klassen och är också tillgängliga för dess underklasser. Ingen annan miljö är tillåten tillgång till den. Detta gör det möjligt att ärva specifika resurser i föräldraklassen av barnklassen.

Pythons konvention för att göra en instansvariabel skyddad är att lägga till ett prefix _ (single underscore) till det. Detta förhindrar effektivt att det nås om det inte är inom en underklass.

exempel: Skyddade attribut

kopiera

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

faktum är att detta inte hindrar instansvariabler från att komma åt eller ändra instansen. Du kan fortfarande utföra följande åtgärder:

exempel: öppna skyddade medlemmar

kopiera

>>> std = Student("Swati", 25)>>> std._name'Swati'>>> std._name = 'Dipa'>>> std._name'Dipa'

Du kan dock definiera en egenskap med hjälp av property decorator och göra den skyddad, som visas nedan.

exempel: Skyddade attribut

kopiera

class Student:def __init__(self,name):self._name = name@propertydef name(self):return [email protected] name(self,newname):self._name = newname

ovan används @property decorator för att göraname() – metoden som egenskap och@name.setter dekoratör till en annan överbelastning avname() metod som egenskap setter metod. Nu är_name skyddad.

exempel: tillgång skyddade medlemmar

kopiera

>>> std = Student("Swati")>>> std.name'Swati'>>> std.name = 'Dipa'>>> std.name'Dipa'>>> std._name # still accessible

ovan använde vi std.nameegenskap för att ändra_nameattribut. Det är dock fortfarande tillgängligt i Python. Därför skulle den ansvariga programmeraren avstå från att komma åt och modifiera instansvariabler prefixade med _ utanför sin klass.

annons

privata medlemmar

Python har ingen mekanism som effektivt begränsar åtkomst till någon instansvariabel eller metod. Python föreskriver en konvention om prefixering av namnet på variabeln / metoden med en enkel eller dubbel understrykning för att efterlikna beteendet hos skyddade och privata åtkomstspecifikationer.

det dubbla understrecket __ prefixet till en variabel gör det privat. Det ger ett starkt förslag att inte röra det utanför klassen. Varje försök att göra det kommer att resultera i en AttributeError:

exempel: privata attribut

kopiera

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

exempel:

kopiera

>>> 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 utför namn mangling av privata variabler. Varje medlem med dubbel understrykning ändras till _object._class__variable. Så det kan fortfarande nås utanför klassen, men övningen bör avstå.

exempel:

kopiera

>>> std = Student("Bill", 25)>>> std._Student__name'Bill'>>> std._Student__name = 'Steve'>>> std._Student__name'Steve'>>> std._Student__display()'This is private method.'

således ger Python konceptuell implementering av offentliga, skyddade och privata åtkomstmodifierare, men inte som andra språk som C#, Java, C++.