Class

Posted on January 30th, 2024
Intermediate
...

Class dalam pemrograman adalah sebuah blueprint atau representasi sesuatu objek. Dalam dunia nyata, kita bisa analogikan class seperti mobil, dimana class mobil memiliki beberapa atribut seperti warnanya, jumlah rodanya, kapasitas bensinnya, dan berbagai macam lainnya.

Menulis class dalam python terlihat seperti berikut

class ClassName:
  pass

Jika kita membuat class bernama Car, maka bentuk class, attribute, dan method nya seperti berikut

class Car:
  tire = 4
  color = "black"

  def start(self):
    return "menyalakan mesin"

c = Car()
print(c.tire)
print(c.start())

Code diatas membuat class bernama Car. Class Car memiliki attribute tire dan color beserta method start. Menulis seperti c = Car() disebut sebagai membuat instance dari class tersebut.

Initializer

Dalam pemrograman OOP (object oriented programming), class dapat memiliki nilai inisialisasi berbeda saat memanggil class tersebut. Cara agar menggunakan insialisasi dalam python, digunakan method __init__. Berikut contoh code inisialisasi class

 class Car:
  def __init__(self, tire, color):
    self.tire = tire
    self.color = color


  def start(self):
    return "menyalakan mesin"


c = Car(4,"black")
print(c.tire)
print(c.start())

Penjelasan __init__ yaitu mengeksekusi class setiap kali class tersebut dipanggil. Dari contoh diatas, class Car akan memasukkan variabel masing - masing ke dalam inisialisasi attributes. Melihat variable yang tersimpan dalam c, gunakan perintah vars(c).

Public, protected dan private

Dalam python sendiri, tidak ada system yang baku untuk menentukan suatu attribute dan method apakah public, protected atau private. Namun dalam penulisan, python memiliki konvensi penamaan yang berguna untuk menyampaikan suatu attribute atau method tidak dimaksudkan untuk dapat di akses dari luar class. Yaitu menggunakan _ (underscore). Contoh penggunaan nya seperti berikut

class Car:
  def __init__(self, tire, color):
    self._tire = tire
    self._color = color


Code diatas tidak sepenuhnya membuat atrribute tidak bisa di akses. Code print(obj._tire) akan tetap memanggil ._tire di dalam class Car. 

Adapun pendekatan lain untuk membatasi akses atrribute dan method dalam class menggunakan konvensi name mangling. Yaitu menggunakan __ (double underscore). Contoh penggunaannya seperti berikut

class SomeClass:
  def __init__(self, value):
    self.__value = value


  def __getval(self):
    return self.__value
 
s = SomeClass("test")
print(s.__value)

Mencoba memanggil class attribute __value akan menghasilkan error Object has no attribute ‘__value’ 

Mencoba memanggil paksa name mangling dapat diakses dengan bentuk seperti s._SomeClass__value. Gunakan vars(s) untuk info attribute.

Kesimpulan dari penggunaan _ (underscore) dan __ (double underscore) adalah agar menutupi attribute atau method dan mencegah ketidak sengajaan menimpa nilai baru ke attribute tersebut.

Class Attributes

Class attribute merupakan class yang memiliki attribute langsung di dalam class tersebut. Attribute tersebut bersifat mengikat pada classnya dan nilainya tidak akan berubah walaupun class tersebut membuat instance baru. Berikut contoh class attributes

class SampleClass:
   number = 0
   def __init__(self):
       SampleClass.number += 1

attribute number terikat pada class SampleClass. SampleClass akan menambahkan 1 number tiap kali class tersebut dipanggil (melalui __init__). Cobalah perhatikan hasilnya di bawah ini

>>> s = SampleClass()
>>> s.number
1
>>> z = SampleClass()
>>> z.number
2

Code diatas, secara berurutan memanggil SampleClass. Pertama instance s menghasilkan 1, berikutnya instance z menghasilkan 2 dimana __init__ menambahkan nilai attribute class itu sendiri.

Agar secara dinamis mengikat atrribute dalam class attributes, gunakan type(self) untuk menggantikan nama classnya sendiri. Berikut contoh penulisannya

class SampleClass:
   number = 0
   def __init__(self):
       type(self).number += 1

Gunakan class attributes ketika ingin membagi attributes sesama instances. Perubahan di dalam class attributes berefek pada semua instance dari class tersebut.

Instance Attributes

Instance attributes merupakan class yang memiliki attribute tertentu sesuai class tertentu. Attribute tersebut bersifat megikat pada instance class tersebut dan nilainya tidak akan sama dengan instance class lainnya. Instance attributes merupakah kebalikan dari class attributes. Berikut contoh instance attributes

class SampleClass:
   def __init__(self, number=0):
       self.number = number
   
   def increment(self):
       self.number += 1
       return self.number

Instance attribute menggunakan self di awal argument setiap method dan meneruskan self tersebut kedalam attribute agar mengikat attribut tersebut di instance attribute. Cobalah perhatikan hasilnya dibawah ini

>>> s = SampleClass()
>>> s.increment()
1
>>> z = SampleClass()
>>> z.increment()
1

Code diatas memperlihatkan setiap instance bekerja tersendiri, instance s dan z tidak membagi nilainya masing - masing. Hal tersebut memudahkan dalam membuat object baru yang terisolasi. Perhatikan code berikut dalam menerapkan instance attribute

class Car:
   def __init__(self, name, tires, color="Black"):
       self.name = name
       self.tires = tires
       self.color = color

Code diatas menggunakan penamaan global yaitu Car. Dengan Car, kita bisa membuat objek mobil lainnya dengan nama - nama yang berbeda. Seperti contoh code berikut

>>> bmw = Car("BMW", 4, "white")
>>> print("Nama :",bmw.name)
Nama : BMW
>>> print("Jml ban :",bmw.tires)
Jml ban : 4
>>> print("Warna :",bmw.color)
Warna : white
>>>
>>>
>>> nissan = Car("Nissan Truck", 6)
>>> print("Nama :",nissan.name)
Nama : Nissan Truck
>>> print("Jml ban :",nissan.tires)
Jml ban : 6
>>> print("Warna :",nissan.color)
Warna : Black

Instance attribute digunakan banyak dalam pemrograman python, sifatnya yang fleksibel dan terisolasi kebanyakan programmer memilih menulis class dalam bentuk seperti ini.