Enkapsulacja jest jedną z podstawowych koncepcji w programowanie obiektowe (OOP) w Pythonie. Opisuje ideę owijania danych oraz metody pracy na danych w ramach jednej jednostki. Nakłada to ograniczenia na bezpośredni dostęp do zmiennych i metod i może zapobiec przypadkowej modyfikacji danych. Klasa jest przykładem enkapsulacji, ponieważ hermetyzuje wszystkie dane będące jej członkiem Funkcje , zmienne itp. Mogą zaistnieć pewne scenariusze, w których będziemy musieli nałożyć ograniczenia na niektóre metody klasy, tak aby nie można było uzyskać do nich dostępu poza klasą ani przez żadne podklasy. Aby wdrożyć to, w grę wchodzą prywatne metody.
Private funkcje w Pythonie
Rozważmy przykład z życia wzięty, silnik samochodowy, który składa się z wielu części, takich jak świece zapłonowe, zawory, tłoki itp. Żaden użytkownik nie używa tych części bezpośrednio, a jedynie wie, jak korzystać z części, które z nich korzystają. Do tego służą metody prywatne. Służy do ukrywania wewnętrznej funkcjonalności dowolnej klasy przed światem zewnętrznym. Metody prywatne to metody, do których nie należy uzyskiwać dostępu poza klasą ani przez żadną klasę bazową. W Pythonie nie ma metod prywatnych, do których nie można uzyskać dostępu poza klasą. Aby jednak zdefiniować metodę prywatną, należy poprzedzić nazwę elementu prefiksem podwójne podkreślenie __ . Notatka: Metoda __init__ to a konstruktor i działa natychmiast po utworzeniu instancji obiektu klasy.
Python3
df lok
# Creating a Base class> class> Base:> ># Declaring public method> >def> fun(>self>):> >print>(>'Public method'>)> ># Declaring private method> >def> __fun(>self>):> >print>(>'Private method'>)> # Creating a derived class> class> Derived(Base):> >def> __init__(>self>):> ># Calling constructor of> ># Base class> >Base.__init__(>self>)> >def> call_public(>self>):> ># Calling public method of base class> >print>(>'
Inside derived class'>)> >self>.fun()> >def> call_private(>self>):> ># Calling private method of base class> >self>.__fun()> # Driver code> obj1>=> Base()> # Calling public method> obj1.fun()> obj2>=> Derived()> obj2.call_public()> # Uncommenting obj1.__fun() will> # raise an AttributeError> # Uncommenting obj2.call_private()> # will also raise an AttributeError> |
>
co to jest modulo w c++
>
Wyjście:
Public method Inside derived class Public method>
Traceback (most recent call last): File '/home/09d6f91fdb63d16200e172c7a925dd7f.py', line 43, in obj1.__fun() AttributeError: 'Base' object has no attribute '__fun' Traceback (most recent call last): File '/home/0d5506bab8f06cb7c842501d9704557b.py', line 46, in obj2.call_private() File '/home/0d5506bab8f06cb7c842501d9704557b.py', line 32, in call_private self.__fun() AttributeError: 'Derived' object has no attribute '_Derived__fun'>
Powyższy przykład pokazuje, że do prywatnych metod tej klasy nie można uzyskać dostępu poza klasą ani przez żadną klasę bazową. Dostęp do metod prywatnych można jednak uzyskać, wywołując metody prywatne za pośrednictwem metod publicznych.
Przykład:
Python3
polecenia sql ddl
# Creating a class> class> A:> ># Declaring public method> >def> fun(>self>):> >print>(>'Public method'>)> ># Declaring private method> >def> __fun(>self>):> >print>(>'Private method'>)> ># Calling private method via> ># another method> >def> Help>(>self>):> >self>.fun()> >self>.__fun()> # Driver's code> obj>=> A()> obj.>Help>()> |
>
czyszczenie pamięci podręcznej npm
>
Wyjście:
Public method Private method>
Zniekształcanie nazw
Python udostępnia magiczną różdżkę, której można używać do wywoływania prywatnych metod również poza klasą. Jest to znane jako zniekształcanie nazw. Oznacza to, że dowolny identyfikator w postaci __geek (co najmniej dwa początkowe znaki podkreślenia lub co najwyżej jedno końcowe podkreślenie) jest zastępowany przez _classname__geek, gdzie nazwa klasy to bieżąca nazwa klasy z usuniętymi wiodącymi podkreśleniami.
Przykład:
Python3
# Creating a class> class> A:> ># Declaring public method> >def> fun(>self>):> >print>(>'Public method'>)> ># Declaring private method> >def> __fun(>self>):> >print>(>'Private method'>)> # Driver's code> obj>=> A()> # Calling the private member> # through name mangling> obj._A__fun()> |
Ulepszona pętla Java
>
>
Wyjście:
Private method>