Apa itu Property di Python
Property adalah fitur bawaan di Python yang memungkinkan Anda mengelola atribut dan metode dari sebuah kelas. Ini merupakan alat yang sangat berguna untuk enkapsulasi dan penyembunyian data, dan penting untuk menulis kode yang efisien dan kokoh. Dengan property, Anda dapat mengontrol bagaimana kelas Anda diakses dan dimodifikasi, serta memastikan bahwa setiap perubahan pada atributnya divalidasi dengan benar.
Property diimplementasikan dengan menggunakan tiga metode: getter
, setter
, dan deleter
. Metode getter digunakan untuk mengambil nilai dari sebuah property, metode setter digunakan untuk menetapkan nilai dari sebuah property, dan metode deleter digunakan untuk menghapus sebuah property.
Selain metode dasar getter, setter, dan deleter, property juga mendukung fitur-fitur canggih seperti read-only, write-only, dan computed properties. Properti read-only dapat diakses tetapi tidak dapat dimodifikasi, properti write-only dapat dimodifikasi tetapi tidak dapat diakses, dan computed properties dihitung berdasarkan properti atau metode lain dari kelas tersebut.
Menggunakan property di Python relatif mudah. Anda hanya perlu mendefinisikan property menggunakan decorator @property
, dan kemudian mendefinisikan metode getter, setter, dan deleter sesuai kebutuhan. Dengan property, Anda dapat membuat kelas yang lebih mudah digunakan dan dipahami, serta kurang rentan terhadap kesalahan dan kerentanan keamanan.
Dasar-Dasar Property: Getter, Setter, dan Deleter
Dalam Python, getter, setter, dan deleter adalah metode khusus yang dapat digunakan untuk mengontrol akses ke properti atau atribut objek. Mereka juga dikenal sebagai metode properti. Getter digunakan untuk mendapatkan nilai dari properti, setter digunakan untuk mengatur nilai properti, dan deleter digunakan untuk menghapus nilai properti. Berikut adalah contoh penggunaan getter, setter, dan deleter di Python:
class Person:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if not isinstance(value, int):
raise ValueError("Age must be an integer")
if value < 0:
raise ValueError("Age cannot be negative")
self._age = value
@age.deleter
def age(self):
del self._age
Pada contoh di atas, kita memiliki kelas Person
yang memiliki dua atribut, yaitu name
dan age
. Decorator @property
digunakan untuk mendefinisikan metode getter untuk kedua atribut tersebut. Decorator @name.setter
dan @age.setter
digunakan untuk mendefinisikan metode setter untuk name
dan age
, masing-masing. Terakhir, decorator @age.deleter
digunakan untuk mendefinisikan metode deleter untuk age
.
Untuk menggunakan kelas ini, kita dapat membuat objek Person
baru dan mengatur propertinya menggunakan metode setter:
person = Person("John", 30)
person.name = "Jane"
person.age = 35
Kita juga dapat mendapatkan nilai dari properti menggunakan metode getter:
print(person.name) # Output: Jane
print(person.age) # Output: 35
Jika kita mencoba mengatur atribut age
ke nilai non-integer atau nilai negatif, maka ValueError
akan dihasilkan:
person.age = "Thirty" # Raises ValueError: Age must be an integer
person.age = -5 # Raises ValueError: Age cannot be negative
Terakhir, kita dapat menghapus atribut age
menggunakan metode deleter:
del person.age
Ini akan menghapus atribut age
dari objek Person
.
Fitur Lanjutan Property: hanya baca, hanya tulis, dan terhitung
Di Python, ada tiga jenis properti: hanya baca, hanya tulis, dan terhitung. Properti ini digunakan untuk mengontrol akses ke atribut objek dan menyediakan antarmuka untuk mendapatkan, mengatur, atau menghitung nilai mereka.
Properti hanya baca adalah atribut yang dapat diakses untuk dibaca, tetapi tidak untuk ditulis. Ini berguna ketika Anda ingin mengekspos nilai atribut tanpa memungkinkan untuk diubah secara langsung. Untuk membuat properti hanya baca, Anda dapat menggunakan dekorator @property
. Berikut adalah contohnya:
class Circle:
def __init__(self, radius):
self.radius = radius
@property
def area(self):
return 3.14 * self.radius ** 2
c = Circle(5)
print(c.area) # Output: 78.5
Dalam contoh ini, properti area
adalah hanya baca, dan dihitung berdasarkan atribut radius
. Kita tidak bisa menetapkan nilai area secara langsung karena tidak ada metode setter yang sesuai.
Properti hanya tulis adalah atribut yang dapat diatur, tetapi tidak dibaca. Ini berguna ketika Anda ingin menyediakan cara untuk menetapkan nilai, tetapi Anda tidak ingin mengekspos nilai saat ini. Untuk membuat properti hanya tulis, Anda dapat mendefinisikan metode setter tanpa metode getter yang sesuai. Berikut adalah contohnya:
class Password:
def __init__(self, value):
self._value = value
@property
def value(self):
raise AttributeError('Cannot read the password value')
@value.setter
def value(self, new_value):
if len(new_value) < 8:
raise ValueError('Password must be at least 8 characters long')
self._value = new_value
p = Password('password')
p.value = 'newpassword'
Dalam contoh ini, properti nilai adalah hanya tulis. Kita bisa menetapkan nilainya menggunakan metode setter, tetapi kita tidak bisa membaca nilainya karena metode getter memunculkan AttributeError
.
Membuat properti terhitung sangat berguna ketika ingin memberikan cara untuk mengakses nilai yang diperoleh dari atribut lain atau data eksternal. Untuk membuat properti terhitung, Anda dapat menggunakan dekorator @property
dan mendefinisikan metode yang menghitung nilainya. Berikut adalah contohnya:
class Temperature:
def __init__(self, celsius):
self.celsius = celsius
@property
def fahrenheit(self):
return self.celsius * 9/5 + 32
t = Temperature(25)
print(t.fahrenheit) # Output: 77.0
Dalam contoh ini, properti fahrenheit
dihitung berdasarkan atribut celsius
. Kita dapat mengakses nilainya seperti atribut biasa, tetapi nilai dihitung secara langsung berdasarkan nilai saat ini dari celsius
.
Praktik Terbaik untuk Menggunakan Property di Python
Ketika menggunakan property di Python, penting untuk mengikuti beberapa praktik terbaik untuk memastikan kode Anda jelas, efisien, dan mudah dipelihara. Berikut adalah beberapa praktik terbaik untuk menggunakan property di Python:
-
Gunakan property untuk mengekspos atribut objek
Property harus digunakan untuk memberikan akses ke atribut objek, daripada secara langsung mengekspos atribut itu sendiri. Ini memungkinkan kontrol yang lebih besar atas bagaimana atribut diakses dan dimanipulasi, dan juga memungkinkan validasi dan manipulasi data dilakukan saat atribut diakses atau dimodifikasi. -
Gunakan dekorator
@property
Saat mendefinisikan sebuah property, gunakan dekorator@property
untuk menunjukkan bahwa itu adalah sebuah property. Ini membuat jelas bagi pengembang lain bahwa atribut diakses melalui metode getter. -
Gunakan dekorator
@property.setter
Saat mendefinisikan sebuah property yang dapat diatur, gunakan dekorator@property.setter
untuk menunjukkan bahwa itu memiliki metode setter. Ini membuat jelas bagi pengembang lain bahwa atribut dapat dimodifikasi, dan juga memungkinkan validasi dan manipulasi data dilakukan saat atribut diatur. -
Gunakan property hanya untuk baca saja
Saat mendefinisikan sebuah property hanya untuk dibaca, pastikan bahwa itu tidak dapat dimodifikasi secara langsung. Ini dapat dilakukan dengan tidak mendefinisikan metode setter, atau dengan menimbulkan sebuah pengecualian dalam metode setter. -
Gunakan computed property
Computed property berguna untuk menghitung nilai atribut berdasarkan atribut lain atau data eksternal. Saat mendefinisikan computed property, pastikan bahwa itu dihitung secara efisien dan akurat, dan bahwa itu tidak dipanggil secara tidak perlu.
Referensi