Python-Public, Protected, Private Members
Klasyczne języki obiektowe, takie jak C++ i Java, kontrolują dostęp do zasobów klas za pomocą publicznych, prywatnych i chronionych słów kluczowych. Prywatni Członkowie klasy nie mają dostępu do środowiska poza klasą. Mogą być obsługiwane tylko z poziomu klasy.
Public Members
public members (ogólnie metody zadeklarowane w klasie) są dostępne spoza klasy. Obiekt tej samej klasy jest wymagany do wywołania metody publicznej. Taki układ zmiennych instancji prywatnych i metod publicznych zapewnia zasadę hermetyzacji danych.
wszyscy członkowie klasy Pythona są domyślnie publiczni. Każdy członek może być dostępny spoza środowiska klasy.
Kopiuj
class Student: schoolName = 'XYZ School' # class attribute def __init__(self, name, age): self.name=name # instance attribute self.age=age # instance attribute
możesz uzyskać dostęp do atrybutów klasyStudent
, a także modyfikować ich wartości, jak pokazano poniżej.
Kopiuj
>>> std = Student("Steve", 25)>>> std.schoolName'XYZ School'>>> std.name'Steve'>>> std.age = 20>>> std.age25
chronione elementy
chronione elementy klasy są dostępne z poziomu klasy i są również dostępne dla jej podklas. Żadne inne środowisko nie ma do niego dostępu. Umożliwia to dziedziczenie określonych Zasobów klasy nadrzędnej przez klasę podrzędną.
konwencja Pythona, aby zmienna instancji była chroniona, polega na dodaniu do niej prefiksu _ (pojedynczego podkreślnika). To skutecznie uniemożliwia dostęp do niej, chyba że jest z podklasy.
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
w rzeczywistości nie uniemożliwia to dostępu do zmiennych instancji lub ich modyfikacji. Nadal możesz wykonać następujące operacje:
Copy
>>> std = Student("Swati", 25)>>> std._name'Swati'>>> std._name = 'Dipa'>>> std._name'Dipa'
jednak możesz zdefiniować właściwość za pomocą dekoratora właściwości i uczynić ją chronioną, jak pokazano poniżej.
Copy
class Student:def __init__(self,name):self._name = name@propertydef name(self):return [email protected] name(self,newname):self._name = newname
powyżej, @property decorator służy do Ustawienia name()
metody jako właściwości i @name.setter
decorator do innego przeciążenia name()
metoda jako metoda ustawiania właściwości. Teraz_name
jest chroniony.
Copy
>>> std = Student("Swati")>>> std.name'Swati'>>> std.name = 'Dipa'>>> std.name'Dipa'>>> std._name # still accessible
powyżej użyliśmy std.name
właściwości, aby zmodyfikować _name
atrybut. Jednak nadal jest dostępny w Pythonie. Dlatego odpowiedzialny programista powstrzyma się od uzyskiwania dostępu i modyfikowania zmiennych instancji poprzedzonych _
spoza swojej klasy.
członkowie prywatni
Python nie ma żadnego mechanizmu, który skutecznie ogranicza dostęp do dowolnej zmiennej instancji lub metody. Python określa konwencję prefiksowania nazwy zmiennej / metody pojedynczym lub podwójnym podkreśleniem, aby emulować zachowanie specyfikacji chronionego i prywatnego dostępu.
podwójne podkreślenie __
poprzedzone prefiksem do zmiennej sprawia, że jest ona prywatna. Daje silną sugestię, aby nie dotykać go spoza klasy. Każda próba tego spowoduje błąd AttributeError:
Kopiuj
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.')
Kopiuj
Python wykonuje manipulowanie nazw zmiennych prywatnych. Każdy element z podwójnym podkreśleniem zostanie zmieniony na _object._class__variable
. Tak więc nadal można uzyskać do niego dostęp spoza klasy, ale praktyka powinna być powstrzymana.
Kopiuj
>>> std = Student("Bill", 25)>>> std._Student__name'Bill'>>> std._Student__name = 'Steve'>>> std._Student__name'Steve'>>> std._Student__display()'This is private method.'
dlatego Python zapewnia koncepcyjną implementację publicznych, chronionych i prywatnych modyfikatorów dostępu, ale nie tak jak inne języki, takie jak C#, Java, C++.
Leave a Reply