Articles

Python-Public, Protected, Private Members

klassieke objectgeoriënteerde talen, zoals C++ en Java, bepalen de toegang tot class resources door publieke, private en beveiligde sleutelwoorden. Privéleden van de klas krijgen geen toegang vanuit de omgeving buiten de klas. Ze kunnen alleen vanuit de klasse worden behandeld.

publieke leden

publieke leden (over het algemeen in een klasse aangegeven methoden) zijn toegankelijk van buiten de klasse. Het object van dezelfde klasse is vereist om een publieke methode aan te roepen. Deze rangschikking van Private instance variabelen en publieke methoden zorgt voor het principe van data encapsulatie.

alle leden in een Python-klasse zijn standaard openbaar. Elk lid kan worden benaderd van buiten de klasse omgeving.

voorbeeld: publieke attributen

kopieer

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

u kunt toegang krijgen tot de attributen van de Studenten de waarden ervan wijzigen, zoals hieronder getoond.

voorbeeld: Toegang tot publieke leden

kopiëren

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

beschermde leden

beschermde leden van een klasse zijn toegankelijk vanuit de klasse en zijn ook beschikbaar voor de subklassen. Geen andere omgeving is toegestaan toegang tot het. Hierdoor kunnen specifieke bronnen van de ouderklasse worden overgenomen door de dochterklasse.

Python ‘ s conventie om een instance variabele te beschermen is het toevoegen van een prefix _ (enkele underscore) aan het. Dit voorkomt effectief dat het wordt benaderd, tenzij het van binnen een subklasse.

voorbeeld: Beschermde attributen

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

In feite voorkomt dit niet dat instantievariabelen toegang krijgen tot de instantie of deze wijzigen. U kunt nog steeds de volgende bewerkingen uitvoeren:

voorbeeld: access Protected Members

kopieer

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

U kunt echter een eigenschap definiëren met property decorator en deze beveiligen, zoals hieronder getoond.

voorbeeld: Beschermde attributen

Copy

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

hierboven wordt @property decorator gebruikt om de name()methode als eigenschap te maken en@name.setterdecorator naar een andere overbelasting van dename()methode als property setter methode. Nu is _name beveiligd.

voorbeeld: Toegangsbeveiligde leden

kopiëren

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

hierboven hebben we std.nameeigenschap gebruikt om_nameattribuut te wijzigen. Echter, het is nog steeds toegankelijk in Python. Vandaar dat de verantwoordelijke programmeur zich zou onthouden van het benaderen en wijzigen van instantievariabelen die voorafgaan met _ van buiten zijn klasse.

advertentie

Private Members

Python heeft geen mechanisme dat effectief toegang beperkt tot elke instance variabele of methode. Python schrijft een conventie voor om de naam van de variabele/methode voor te schrijven met een enkele of dubbele underscore om het gedrag van beschermde en private access specifiers na te bootsen.

De dubbele underscore __ prefixed naar een variabele maakt het privé. Het geeft een sterke suggestie om het niet aan te raken van buiten de klas. Elke poging daartoe zal resulteren in een Attribuuterror:

voorbeeld: Private attributen

kopiëren

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

voorbeeld:

kopiëren

>>> 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 voert naamsvermangeling van privévariabelen uit. Elk lid met een dubbele underscore zal worden gewijzigd in _object._class__variable. Dus, het kan nog steeds worden benaderd van buiten de klas, maar de praktijk moet worden onthouden.

voorbeeld:

Copy

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

Python biedt dus conceptuele implementatie van publieke, beveiligde en private toegangsmodifiers, maar niet zoals andere talen zoals C#, Java, C++.