πŸ”“ Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ Π² Python: Π»Π΅Π³ΠΊΠΈΠΉ шаг-Π·Π°-шагом руководство 🐍

Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ Π² ΠΏΠΈΡ‚ΠΎΠ½Π΅

Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ - это ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ класса ΠΎΡ‚ внСшнСго доступа. Π’ Python ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ использования ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² доступа ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ класса.

Π•ΡΡ‚ΡŒ Π΄Π²Π° основных способа Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ инкапсуляции:

1. Π‘ΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ подчСркивания


class MyClass:
    def __init__(self):
        self.__private_attribute = "Private attribute"
        self.__private_method()

    def __private_method(self):
        print("Private method")

obj = MyClass()
print(obj.__private_attribute)  # Ошибка: AttributeError
obj.__private_method()  # Ошибка: AttributeError

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ __private_attribute ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ __private_method ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌΠΈ (private) ΠΈ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ класса. Если ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ этим Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ ΠΈΠ»ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ·Π²Π½Π΅ класса, Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

2. ИспользованиС соглашСний ΠΎ сокрытии


class MyClass:
    def __init__(self):
        self._protected_attribute = "Protected attribute"
        self._protected_method()

    def _protected_method(self):
        print("Protected method")

obj = MyClass()
print(obj._protected_attribute)  # Доступ ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ
obj._protected_method()  # Π’Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ _protected_attribute ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ _protected_method ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ "Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΌΠΈ" (protected), Π½ΠΎ доступ ΠΊ Π½ΠΈΠΌ всС Ρ€Π°Π²Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ ΠΈΠ·Π²Π½Π΅ класса. БоглашСниС ΠΎ сокрытии ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π±Π΅Π· нСобходимости, Π½ΠΎ это Π½Π΅ являСтся строгим ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΠΌ.

Π”Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚

Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ Π² ΠΏΠΈΡ‚ΠΎΠ½Π΅

Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π²Π°ΠΆΠ½Ρ‹Ρ… понятий Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ. Π­Ρ‚ΠΎ концСпция, которая позволяСт ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ ΠΈ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΈΡ… ΠΎΡ‚ прямого доступа ΠΈΠ·Π²Π½Π΅. Π’ ΠΏΠΈΡ‚ΠΎΠ½Π΅ инкапсуляция достигаСтся использованиСм ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ синтаксиса ΠΈ соглашСниями ΠΏΠΎ имСнованию.

Π’ ΠΏΠΈΡ‚ΠΎΠ½Π΅ инкапсуляция достигаСтся ΠΏΡƒΡ‚Π΅ΠΌ использования Π΄Π²ΡƒΡ… ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π­Ρ‚ΠΎ называСтся "ΠΈΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠ°Π½Π³Π»ΠΈΠ½Π³". ΠŸΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΡ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ ΠΊΠΎΠ½Ρ†Π΅ ΠΈΠΌΠ΅Π½ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ являСтся ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ доступСн ΠΈΠ·Π²Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.


class MyClass:
    def __init__(self):
        self.__private_attr = 42

    def __private_method(self):
        return "Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄"

    def public_method(self):
        return self.__private_attr * 2

obj = MyClass()
print(obj.public_method())  # Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ 84
print(obj.__private_attr)  # Π’Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ AttributeError
print(obj.__private_method())  # Π’Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ AttributeError

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм класс MyClass с ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ "__private_attr" ΠΈ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ "__private_method". ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ этим ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ Ρ‡Π»Π΅Π½Π°ΠΌ класса ΠΈΠ·Π²Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Если Π±Ρ‹ ΠΌΡ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π±Ρ‹ ΠΎΡˆΠΈΠ±ΠΊΡƒ AttributeError.

Однако, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ класса. НапримСр, Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ "public_method" ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ "__private_attr".

Π’Π°ΠΊΠΆΠ΅, инкапсуляция Π½Π΅ являСтся строгой Π² ΠΏΠΈΡ‚ΠΎΠ½Π΅. Если ΠΌΡ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ Ρ‡Π»Π΅Π½Π°ΠΌ класса, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ это:


class MyClass:
    def __init__(self):
        self.__private_attr = 42

    def __private_method(self):
        return "Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄"

    def public_method(self):
        return self.__private_attr * 2

obj = MyClass()
print(obj.public_method())  # Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ 84
print(obj._MyClass__private_attr)  # Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ 42
print(obj._MyClass__private_method())  # Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ "Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄"

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ использования ΠΈΠΌΠ΅Π½ΠΈ класса ΠΈ подчСркивания. Π₯отя это тСхничСски Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ рСкомСндуСтся Π΄Π΅Π»Π°Ρ‚ΡŒ это, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ инкапсуляции ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ошибкам Π² ΠΊΠΎΠ΄Π΅.

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, инкапсуляция являСтся Π²Π°ΠΆΠ½Ρ‹ΠΌ понятиСм Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ позволяСт ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΡ‚ прямого доступа ΠΈΠ·Π²Π½Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π’ ΠΏΠΈΡ‚ΠΎΠ½Π΅ инкапсуляция достигаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ подчСркивания ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π₯отя Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ Ρ‡Π»Π΅Π½Π°ΠΌ класса, это Π½Π΅ рСкомСндуСтся, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ инкапсуляции ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ошибкам.

Π’ΠΈΠ΄Π΅ΠΎ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ Π² Python | Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ курс. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python

Π˜ΠΠšΠΠŸΠ‘Π£Π›Π―Π¦Π˜Π― Π’ ООП ПИВОНА

ООП: Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ Π² python

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ:

πŸ” Как Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ Python ΠΈΠ»ΠΈ Java: сравнСниС языков программирования

πŸ–ŒοΈ Как ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ canvas python: подробная инструкция для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ² 🐍

Π”Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ Python: ΠΊΠ°ΠΊ выполняСтся ΠΈ ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ?

πŸ”“ Как ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ Π² Python: Π»Π΅Π³ΠΊΠΈΠΉ шаг-Π·Π°-шагом руководство 🐍

🐍 Π’Π°ΠΉΠ½Ρ‹ питания ΠΏΠΈΡ‚ΠΎΠ½Π°: Ρ‡Ρ‚ΠΎ Сст этот змСйский Π΄ΠΈΠΊΡ‚Π°Ρ‚ΠΎΡ€?

πŸ”₯ Как Π² Python возвСсти число Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ: простой ΠΈ эффСктивный ΠΌΠ΅Ρ‚ΠΎΠ΄

Π’Ρ‹Π±ΠΎΡ€ ΠΏΠΈΡ‚ΠΎΠ½Π°: ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΈΡ‚ΠΎΠ½ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½Π° ваши Π½ΡƒΠΆΠ΄Ρ‹ Π² 2021 Π³ΠΎΠ΄Ρƒ? 🐍