Python'da Kapsülleme

Jan 21 2023
Bir kelime olarak kapsülleme, programlama dünyasında, özellikle yeni başlayan biriyseniz, ilk kez duyulduğunda çok süslü, teknik ve karmaşık bir şey gibi görünüyor. Kapsülleme hakkında çeşitli kaynaklardan bilgi edinmeye çalıştığımda, birisinin anlamayı anlatım yoluyla kolaylaştırmasını diledim.

Bir kelime olarak kapsülleme, programlama dünyasında, özellikle yeni başlayan biriyseniz, ilk kez duyulduğunda çok süslü, teknik ve karmaşık bir şey gibi görünüyor. Kapsülleme hakkında çeşitli kaynaklardan bilgi edinmeye çalıştığımda, birisinin anlamayı anlatım yoluyla kolaylaştırmasını diledim. Bu yüzden burada, hem çevrimiçi hem de çevrimdışı tonlarca materyalden geçtikten sonra anladığım gibi kapsüllemeyi açıklamaya çalışıyorum.

  • Kapsülleme hakkında bilgi edinmek için burada olduğunuz için, OOP'ler ( Nesne Yönelimli Programlama ) hakkında zaten biraz bilgi sahibi olduğunuzu varsayıyorum.

“ Kapsülleme, verileri (değişkenleri) ve verilere (yöntemleri) etki eden kodu tek bir birim olarak sarmalama mekanizmasıdır ”

Kendi başına oldukça tehlikeli bir tanım gibi görünüyor. basit bir şekilde anlayalım.

Bir girişimin kıdemli programcısı olduğunuzu ve kullanıcıların girişiminizin uygulamasında hesap oluşturmasına olanak tanıyan bir mekanizma oluşturmaktan sorumlu bir ekibiniz olduğunu varsayalım. Şimdilik hesabın yalnızca kullanıcının adı ve parolası kullanılarak kurulmasını istediğinizi ve yalnızca sayısal parolalara izin verdiğinizi varsayalım. Evet! Parolaların yalnızca sayısal olmasının gerçek dünyada pratik olmadığını biliyorum, ancak konuyu anlamak adına bunu varsayalım. Kıdemli bir programcı olarak, hesap sınıfını oluşturmaktan siz sorumlu olacaksınız ve genç programcılar bu sınıfı kullanmaktan sorumlu olacak.

sınıfı aşağıdaki gibi oluşturduğunuzu varsayalım:

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"

Diyelim ki ' Rohit ' kullanıcı ve hesabı aşağıdaki komutu kullanarak oluşturdu:

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

Şimdi bu tür durumların üstesinden gelmek için, işlerimizi ve kullanıcılarımızın kimliklerini kurtarmak için süper kahramanımız olarak kapsülleme geliyor.

Kapsüllemenin yaptığı, değişkenlerinizi özel yapmanıza izin vermesidir. Değişkenleri (data) kaydırmanın anlamı budur . Python'da bunu nasıl yapabiliriz? Özel yapmak istediğiniz verilerin ( __data ) ön ekine çift alt çizgi eklemeniz yeterlidir.

Şimdi Account sınıfımız durumunda, başka birinin kullanıcı şifremizi bilmesini istemiyoruz. bu yüzden kodumuzda aşağıdaki gibi bir değişiklik yapacağız:

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"

Şimdi birisi şifre değişkenine erişmeye çalışırsa, kendisine aşağıdaki gibi bir hata atılacaktır:

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

Ama hiçbir şey özel değilse neden kapsülleme kavramı var? Aklından geçenlerin bu olduğunu biliyorum, değil mi? Yani mesele şu ki, başkalarının (genç programcılar, kullanıcılar) önemli değişkenleri, yöntemleri bilmesini veya bunlarda değişiklik yapmasını istemediğinizde kapsülleme gerekir. Kaynak koduna erişemedikleri sürece hangi değişkenlerin veya yöntemlerin özel olduğunu bilemezler ve dolayısıyla bunlara erişemez veya değiştiremezler.

Ama ya Rohit şifresini unuttuysa ve onu geri almak ya da değiştirmek isterse? Kural, sınıfımızda Getter ve Setter yöntemleri olarak bilinen özel değişkene erişmeye ve bu değişkeni değiştirmeye izin verecek 2 yöntem oluşturmamızdır . bunlar nasıl yapılır? aşağıdaki kodu kullanın:

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

Yalnızca değişkenler değil, python, yöntemlerinizi özel yapmanıza da izin verir. İşlem aynıdır, sadece yöntem adınızı "__method" olarak değiştirin ve yönteminiz özel hale getirilecektir.

Özel değişkenler oluşturma, alıcı yöntemlerle özel değişkenlere erişme ve ayarlayıcı yöntemleri kullanarak özel değişken değerini değiştirme kavramının tamamı Kapsülleme olarak bilinir .

Umarım bu blog size bir şekilde yardımcı olabilir. oturumu kapatma ! güle güle