Инкапсуляция как слово, услышанное впервые, кажется очень причудливой, технической и сложной вещью в мире программирования, особенно если вы новичок. Когда я пытался узнать об инкапсуляции из разных источников, мне хотелось, чтобы кто-то мог облегчить понимание в повествовательной форме. Итак, здесь я пытаюсь объяснить инкапсуляцию так, как я ее понял, просмотрев тонны материалов как онлайн, так и офлайн.

  • Поскольку вы здесь, чтобы узнать об инкапсуляции, я предполагаю, что у вас уже есть некоторые знания об ООП (объектно-ориентированном программировании).

Если мы пойдем по определению в Google, оно указывает инкапсуляцию как:

« Инкапсуляция — это механизм объединения данных (переменных) и кода, воздействующего на данные (методы) вместе как единое целое »

Само по себе это определение кажется довольно опасным. позволяет понять это простым способом.

Предположим, что вы старший программист стартапа и у вас есть команда, которая отвечает за создание механизма, позволяющего пользователям создавать учетные записи в приложении вашего стартапа. Предположим, на данный момент вы хотите, чтобы учетная запись была настроена только с использованием имени и пароля пользователя, и единственные пароли, которые вы разрешаете, являются числовыми. Да! Я знаю, что в реальном мире нецелесообразно использовать только числовые пароли, но давайте просто предположим это для понимания темы. Будучи старшим программистом, вы будете нести ответственность за создание класса учетной записи, а младшие программисты будут нести ответственность за использование этого класса.

предположим, вы создали класс следующим образом:

class Account:
    # constructor
    def __init__(self):
        self.user = ''
        self.password = 0
        self.menu()
    
    # display option
    def menu(self):
        user_input = input("""
        Select to Enter the following details:
        1. set account
        2. login
        5. Exit
        """)
        if user_input == '1':
            self.set_account()
        elif user_input == '2':
            self.login()
        else:
            exit()
    # To set account
    def set_account(self):
        user_name = input("set user id: ")
        self.user = user_name
        user_password = int(input("Set Password: "))
        self.password = user_password
    # To login
    def login(self):
        user_input = input("enter User id: ")
        if user_input == self.user:
            user_pass = int(input("enter password: "))
            if user_pass == self.password:
                return "Welcome {}".format(self.user)
            else:
                return "wrong password"
        else:
            return "user not found"
  

Теперь класс готов. Я знаю, что это далеко не идеально, но просто для понимания давайте предположим, что класс Account позволяет пользователям создавать и входить в свою учетную запись.

скажем, «Rohit» — это пользователь, и он создал учетную запись с помощью следующей команды:

rohit = Account()

# after running the above code we get the prompt and add the following detail
"""
Select to Enter the following details:
        1. set account
        2. login
        5. Exit
        1
set user id: rohit
Set Password: 123
"""

Теперь предположим, что это хакер, пытающийся войти в аккаунт Рохита. И, к нашему удивлению, он легко смог войти в чей-то аккаунт. Как? Просто запустив следующую строку кода:

rohit.password

в шоке? да, так легко получить чей-то пароль. Это огромный недостаток приложения, поскольку любой может войти в вашу учетную запись, просто зная ваш идентификатор пользователя.

Теперь, чтобы справиться с такими ситуациями, инкапсуляция становится нашим супергероем, чтобы сохранить наши рабочие места и удостоверения наших пользователей.

Что делает инкапсуляция, так это то, что она позволяет вам сделать ваши переменные личными. Вот что означает обтекание переменных (данных). Как мы можем сделать это в питоне. Просто добавьте двойное подчеркивание в префикс данных, которые вы хотите сделать приватными ( __data ).

Теперь, в случае нашего класса Account, мы не хотим, чтобы кто-то еще знал пароль наших пользователей. поэтому мы внесем изменения в наш код следующим образом:

class Account:

    def __init__(self):
        self.user = ''
        self.__password = 0
        self.menu()
            
    def menu(self):
        user_input = input("""
        Select to Enter the following details:
        1. set account
        2. login
        5. Exit
        """)
        if user_input == '1':
            self.set_account()
        elif user_input == '2':
            self.login()
        else:
            exit()
    
    def set_account(self):
        user_name = input("set user id: ")
        self.user = user_name
        user_password = int(input("Set Password: "))
        self.__password = user_password
    
    def login(self):
        user_input = input("enter User id: ")
        if user_input == self.user:
            user_pass = int(input("enter password: "))
            if user_pass == self.__password:
                return "Welcome {}".format(self.user)
            else:
                return "wrong password"
        else:
            return "user not found"

Что мы сделали? просто изменил переменную «пароль» на «__password» везде. просто внесение этого небольшого изменения в наш код гарантирует, что никто извне не сможет изменить или перезаписать наши объявленные переменные.

Теперь, если кто-то попытается получить доступ к переменной пароля, он/она получит следующую ошибку:

rohit.password

# running the above piece of code will output the following error
"""
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-7ddf6c297392> in <module>
----> 1 rohit.password

AttributeError: 'Account' object has no attribute 'password'
"""

Но что, если я скажу, что вы все еще можете получить доступ к этой переменной «пароль». Не верите мне? Запустите следующий фрагмент кода, и вы сами все увидите

rohit._Account__password

# Output 
# 1234

Просто используя «_className__privateVariable», вы можете получить доступ к закрытым переменным. Расстроенный ? ну, это то, что есть. Честно говоря, в питоне нет ничего по-настоящему частного, и я был разочарован, узнав об этом факте. Но почему python разрешает доступ к частной переменной? Ответ, который я нашел на этот вопрос, заключался в следующем: «Python — это язык программирования, созданный для профессионалов».

Но зачем вообще существует концепция инкапсуляции, если ничего не является приватным? Я знаю, это то, что происходит в твоей голове, верно? Итак, дело в том, что инкапсуляция нужна, когда вы не хотите, чтобы другие (младшие программисты, пользователи) знали или вносили изменения в важные переменные, методы. До тех пор, пока они не получат доступ к исходному коду, они не смогут узнать, какие переменные или методы являются закрытыми, и, следовательно, не смогут получить к ним доступ или изменить их.

Но что, если Рохит забыл свой пароль и хочет восстановить или изменить его? Соглашение заключается в том, что мы создаем 2 метода в нашем классе, которые позволят получить доступ и изменить закрытую переменную, известную как методы Getter и Setter. как сделать это? используйте следующий код:

class Account:

    def __init__(self):
        self.user = ''
        self.__password = 0
        self.menu()
    
    # GETTER
    def get_pass(self):
        return self._Account__password
    # SETTER
    def set_pass(self,newpass):
        if type(newpass) == int:
            self.__password = newpass
        else: return "Password should only be numeric"
            
    def menu(self):
        user_input = input("""
        Select to Enter the following details:
        1. set account
        2. login
        5. Exit
        """)
        if user_input == '1':
            self.set_account()
        elif user_input == '2':
            self.login()
        else:
            exit()
    
    def set_account(self):
        user_name = input("set user id: ")
        self.user = user_name
        user_password = int(input("Set Password: "))
        self.__password = user_password
    
    def login(self):
        user_input = input("enter User id: ")
        if user_input == self.user:
            user_pass = int(input("enter password: "))
            if user_pass == self.__password:
                return "Welcome {}".format(self.user)
            else:
                return "wrong password"
        else:
            return "user not found

Теперь использование «rohit.get_pass()» позволит вам получить доступ к вашему паролю, а «rohit.set_pass(3456)» позволит вам изменить свой пароль на 3456.

Не только переменные, python даже позволяет вам сделать ваши методы приватными. Процесс такой же, просто измените имя метода на «__method», и ваш метод станет приватным.

Вся эта концепция создания приватных переменных, доступа к приватным переменным с помощью методов получения и изменения значения частной переменной с помощью методов установки известна как инкапсуляция. .

Надеюсь, что этот блог может помочь вам в чем-то. отписываюсь! пока👋