Traffine I/O

Bahasa Indonesia

2023-02-24

Memahami Property di Python

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:

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:

python
person = Person("John", 30)
person.name = "Jane"
person.age = 35

Kita juga dapat mendapatkan nilai dari properti menggunakan metode getter:

python
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:

python
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:

python
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:

python
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:

python
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:

python
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

https://realpython.com/python-property/
https://www.programiz.com/python-programming/property
https://www.programiz.com/python-programming/methods/built-in/property
https://www.freecodecamp.org/news/python-property-decorator/
https://www.geeksforgeeks.org/python-property-function/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!