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.
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 Student
en de waarden ervan wijzigen, zoals hieronder getoond.
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.
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:
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.
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.setter
decorator naar een andere overbelasting van dename()
methode als property setter methode. Nu is _name
beveiligd.
kopiëren
>>> std = Student("Swati")>>> std.name'Swati'>>> std.name = 'Dipa'>>> std.name'Dipa'>>> std._name # still accessible
hierboven hebben we std.name
eigenschap gebruikt om_name
attribuut 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.
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:
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.')
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.
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++.
Leave a Reply