Python - Penyandian: Panduan untuk Pemula

Hai di sana, penyihir Python masa depan! Hari ini, kita akan melompat ke atas dunia penyihir penyandian. Jangan khawatir jika perkataan itu terdengar seperti satu rakit penyembahan daripada Harry Potter - pada akhir pelajaran ini, kamu akan menggunakan konsep ini seperti seorang profesional!

Python - Encapsulation

Apakah Penyandian?

Penyandian adalah seperti memiliki rakit rahsia dengan kunci. Ia adalah satu cara untuk membundling data (masukan rakit) dan kaedah yang bekerja pada data tersebut (tindakan untuk menulis di rakit) ke atas satu unit tunggal, sementara juga mengawal akses kepada data tersebut. Di Python, kita mencapai ini menggunakan kelas.

Mari kita mula dengan satu contoh mudah:

class Rakit:
def __init__(self):
self.masukan = []

def tambah_masukan(self, masukan):
self.masukan.append(masukan)

def dapatkan_masukan(self):
return self.masukan

rakit_saya = Rakit()
rakit_saya.tambah_masukan("Dear Rakit, hari ini saya belajar tentang penyandian!")
print(rakit_saya.dapatkan_masukan())

Dalam contoh ini, Rakit adalah kelas kami. Ia memiliki atribut privasi masukan (kandungan rakit rahsia kita) dan dua kaedah untuk berinteraksi dengannya. Ini adalah penyandian dalam tindakan!

Pelaksanaan Penyandian di Python

Atribut Privasi

Di Python, kita menggunakan konvensyen untuk menambah awalan underscore pada atribut untuk menunjukkan mereka adalah privasi. Mari kemas kini kelas Rakit kami:

class Rakit:
def __init__(self):
self._masukan = []  # Catatunderscore

def tambah_masukan(self, masukan):
self._masukan.append(masukan)

def dapatkan_masukan(self):
return self._masukan.copy()  # Kembalikan salinan untuk melindungi asal

rakit_saya = Rakit()
rakit_saya.tambah_masukan("Saya suka Python!")
print(rakit_saya.dapatkan_masukan())
# Ini akan berfungsi, tetapi tidak dianjurkan:
print(rakit_saya._masukan)

Underscore memberitahu penyprogram lain, "Hai, ini adalah privasi! Jangan sentuh secara langsung!" Tetapi di Python, ia adalah lebih seperti perjanjian seorang pria - kamu masih boleh mengaksesnya, tetapi kamu sepatutnya tidak.

Dekorator Properti

Untuk lebih banyak kawalan, kita boleh menggunakan dekorator properti. Mereka adalah seperti penyelamat penyihir untuk atribut kami:

class Rakit:
def __init__(self):
self._masukan = []

def tambah_masukan(self, masukan):
self._masukan.append(masukan)

@property
def masukan(self):
return self._masukan.copy()

rakit_saya = Rakit()
rakit_saya.tambah_masukan("Properti adalah kool!")
print(rakit_saya.masukan)  # Ini berfungsi
# rakit_saya.masukan = []  # Ini akan memunculkan kesalahan

Dekorator @property membolehkan kita mengakses masukan seperti atribut, tetapi sebenarnya memanggil kaedah di belakang layar. Ini memberikan kita lebih banyak kawalan atas cara data diakses.

Setters dan Getters

Bila-bila masa, kita mahu membenarkan pengubahsuaian terkawal atas atribut kami. Masukkan setters:

class Rakit:
def __init__(self):
self._masukan = []

def tambah_masukan(self, masukan):
self._masukan.append(masukan)

@property
def masukan(self):
return self._masukan.copy()

@masukan.setter
def masukan(self, masukan_baru):
if isinstance(masukan_baru, list):
self._masukan = masukan_baru
else:
raise ValueError("Masukan mestilah dalam bentuk senarai")

rakit_saya = Rakit()
rakit_saya.masukan = ["Hari 1", "Hari 2"]  # Ini berfungsi sekarang
print(rakit_saya.masukan)
rakit_saya.masukan = "Bukan senarai"  # Ini akan memunculkan kesalahan

Sekarang kita boleh menetapkan masukan secara langsung, tetapi hanya jika ia adalah senarai. Rakit kita menjadi sangat klasik!

Mengapa Menggunakan Penyandian?

  1. Perlindungan Data: Ia menghalang pengubahsuaian data secara kebetulan.
  2. Kesanggupan: Anda boleh mengubah implementasi dalaman tanpa mengganggu kod luar.
  3. Kawalan: Anda yang memutuskan cara data anda diakses dan diubahsuai.

Bayangkan jika siapa saja boleh untuk menyelerakan di rakit anda tanpa izin anda - kerosakan! Penyandian menjaga hal-hal yang beratur dan aman.

Teknik Penyandian Lanjutan

Name Mangling

Bila anda benar-benar mahu untuk menjaga hal-hal yang privat, Python menawarkan name mangling:

class SuperSecretRakit:
def __init__(self):
self.__ultra_private = "Rahsia saya yang paling dalam"

def reveal_secrets(self):
return self.__ultra_private

rakit = SuperSecretRakit()
print(rakit.reveal_secrets())  # Ini berfungsi
# print(rakit.__ultra_private)  # Ini memunculkan kesalahan AttributeError
print(rakit._SuperSecretRakit__ultra_private)  # Ini berfungsi, tetapi benar-benar tidak dianjurkan!

Twin underscore menyebabkan Python untuk "mangling" nama, membuatnya lebih sukar (tetapi bukan mustahil) untuk diakses dari luar kelas.

Penyandian dengan Properti

Mari kita cipta satu contoh yang lebih kompleks - akaun bank:

class BankAccount:
def __init__(self, initial_balance=0):
self._balance = initial_balance

@property
def balance(self):
return self._balance

@balance.setter
def balance(self, value):
if value < 0:
raise ValueError("Baki tidak boleh negatif")
self._balance = value

def deposit(self, amount):
if amount <= 0:
raise ValueError("Jumlah deposit mestilah positif")
self.balance += amount

def withdraw(self, amount):
if amount <= 0:
raise ValueError("Jumlah penarikan mestilah positif")
if amount > self.balance:
raise ValueError("Dana tidak mencukupi")
self.balance -= amount

account = BankAccount(1000)
print(account.balance)  # 1000
account.deposit(500)
print(account.balance)  # 1500
account.withdraw(200)
print(account.balance)  # 1300
# account.balance = -500  # Ini akan memunculkan ValueError

Kelas BankAccount menyandikan baki, memastikan ia tidak menjadi negatif dan bahawa deposit dan penarikan adalah sah.

Jadual Kaedah Penyandian

Kaedah Keterangan Contoh
Awalan Underscore Menunjukkan atribut privasi self._private_var
Dekorator Properti Mencipta getter untuk atribut @property
Dekorator Setter Mencipta setter untuk properti @attribute.setter
Name Mangling Mencipta atribut yang sangat privat self.__very_private

Kesimpulan

Penyandian adalah seperti menjadi penyelamat yang bertanggungjawab untuk data anda. Ia bukan tentang menjadi rahsia, tetapi tentang memastikan data anda diurus dengan penyusuhan dan niat. Apabila anda teruskan perjalanan Python anda, anda akan mendapati penyandian menjadi alat yang tak ternilai bagi membuat kod yang kuat dan dapat dipelihara.

Ingat, pemula Python, dengan kuasa besar datang tanggungjawab besar. Gunakan penyandian dengan bijak, dan kod anda akan berterima kasih kepada anda!

Sekarang, lakukan penyandian! Dan jangan lupa untuk menulis di rakit (yang terpelihara dengan baik) anda tentang semua yang kool yang anda belajar tentang Python. Selamat coding!

Credits: Image by storyset