A.38. Python OOP ➜ Class Method
Pada chapter ini kita akan belajar tentang jenis method lain yang tersedia di Python, yaitu class method, serta perbedaannya dibanding instance method dan constructor.
A.38.1. Pengenalan Class method
Class method adalah method yang pemiliknya adalah class dengan pengaksesan adalah via class, berbeda dibanding instance method yang diperuntukan untuk instance object. Jika instance method memiliki parameter self
yang isinya adalah instance object, maka class method memiliki parameter cls
yang isinya adalah tipe data class.
Jika dilihat dari segi deklarasinya, class method dan instance method memiliki perbedaan berikut:
- Instance method memiliki parameter pertama bernama
self
, dengan isi adalah instance object. - Class method memiliki parameter pertama bernama
cls
yang merupakan alias dari class dimana method tersebut dideklarasikan (misalnya class method dideklarasikan dalam classCar
, maka paramtercls
berisi tipe data classCar
). - Selain perbedaan di atas, class method dideklariskan dengan menuliskan decorator
@classmethod
Pembahasan detail mengenai decorator dibahas pada chapter Decorator
Agar lebih jelas silakan pelajari kode berikut lalu praktekan. Disini sebuah class bernama ClanHouse
dibuat dengan isi 3 buah fungsi:
- Constructor
__init__()
dengan overload parametername
danhouse
- Class method
create()
digunakan untuk membuat instance objectClassHouse
- Instance method
info()
digunakan untuk menampilkan dataname
danhouse
class ClanHouse:
def __init__(self, name = "", house = ""):
self.name = name
self.house = house
@classmethod
def create(cls):
obj = cls()
return obj
def info(self):
print(f"{self.name} of {self.house}")
Bisa dilihat perbedaan deklarasi instance method dan class method di contoh tersebut. Method create()
memiliki parameter pertama cls
yang merupakan alias untuk tipe data class ClanHouse
. Lewat cls
, dibuat sebuah instance object bernama obj
kemudian dijadikan nilai balik method create()
.
Statement
obj = cls()
dalam methodcreate()
adalah ekuivalen denganobj = ClanHouse()
,
karena dalam method tersebut nilaicls
adalah tipe data class dimana method dideklarasikan, yaituClanHouse
Selanjutnya, dari class ClanHouse
akan dibuat 3 buah instance object berikut:
- Object
p1
dibuat menggunakan constructor - Object
p2
dibuat menggunakan constructor juga, dengan parameter di-overload - Object
p3
dibuat menggunakan class methodcreate()
. Class method tersebut diakses dari class, bisa dilihat dari syntax-nya yaituClanHouse.create()
.
p1 = ClanHouse()
p1.name = "Paul Atriedes"
p1.house = "House of Atriedes"
p1.info()
# output ➜ Paul Atriedes of House of Atriedes
p2 = ClanHouse("Lady Jessica", "Bene Gesserit")
p2.info()
# output ➜ Lady Jessica of Bene Gesserit
p3 = ClanHouse.create()
p3.name = "Baron Vladimir Harkonnen"
p3.house = "House of Harkonnen"
p3.info()
# output ➜ Baron Vladimir Harkonnen of House of Harkonnen
Parameter
cls
bisa disebut dengan parameter implicit atau implisit karena kita tidak berinteraksi secara langsung saat pengisian nilai. Nilaicls
otomatis terisi saat class method diakses.
A.38.2. Class method parameter
Class method juga bisa memiliki parameter seperti umumnya fungsi. Jika pada instance method dan constructor parameter adalah ditulis setelah self
, pada class method parameter ditulis setelah cls
. Contoh:
class ClanHouse:
def __init__(self, name = "", house = ""):
self.name = name
self.house = house
@classmethod
def create(cls, name = "", house = ""):
obj = cls()
obj.name = name
obj.house = house
return obj
def info(self):
print(f"{self.name} of {self.house}")
p2 = ClanHouse("Lady Jessica", "Bene Gesserit")
p2.info()
# output ➜ Lady Jessica of Bene Gesserit
p4 = ClanHouse.create("Glossu Rabban", "House of Harkonnen")
p4.info()
# output ➜ Glossu Rabban of House of Harkonnen
Dari kode di atas bisa dilihat bahwa parameter cls
milik class method diperlakukan mirip seperti parameter self
milik constructor dan instance method.
- Pada saat pengaksesan instance method atau constructor, parameter
self
adalah diabaikan karena otomatis berisi instance object. - Sifat yang sama juga berlaku pada parameter
cls
pada class method. Saat diakses via class (contoh:ClanHouse.create()
), parametercls
diabaikan.
Parameter cls
pada method create()
berisi tipe data class ClanHouse
, dan pembuatan instance object selalu via pemanggilan nama class, maka dari sini pemanggilan cls()
dalam method create()
juga bisa diikuti dengan pengisian argument parameter.
Sebagai perbandingan, kedua bentuk pemanggilan constructor via cls()
berikut adalah ekuivalen:
Cara 1: variabel
cls
digunakan dipanggil sebagai constructor tanpa parameterclass ClanHouse:
def __init__(self, name = "", house = ""):
self.name = name
self.house = house
@classmethod
def create(cls, name = "", house = ""):
obj = cls()
obj.name = name
obj.house = house
return objCara 2: variabel
cls
digunakan dipanggil sebagai constructor dengan diisi argument parameterclass ClanHouse:
def __init__(self, name = "", house = ""):
self.name = name
self.house = house
@classmethod
def create(cls, name = "", house = ""):
obj = cls(name, house)
return obj
A.38.3. Pengaksesan class method via instance object
Sampai sini penulis rasa bisa dipahami perbedaan cara pengaksesan antara instance method dan class method. Instance method diakses via instance object, dan class method diakses via class.
Selain cara tersebut, sebenarnya class method bisa juga diakses via instance object lho, dan hal seperti ini diperbolehkan penerapannya. Caranya bisa dilihat pada kode berikut:
class ClanHouse:
def __init__(self, name = "", house = ""):
self.name = name
self.house = house
def info(self):
print(f"{self.name} of {self.house}")
@classmethod
def create(cls, name = "", house = ""):
obj = cls()
obj.name = name
obj.house = house
return obj
p2 = ClanHouse("Lady Jessica", "Bene Gesserit")
p2.info()
# output ➜ Lady Jessica of Bene Gesserit
p4 = ClanHouse.create("Glossu Rabban", "House of Harkonnen")
p4.info()
# output ➜ Glossu Rabban of House of Harkonnen
p5 = p2.create("Irulan Corrino", "Corrino Empire")
p5.info()
# output ➜ Irulan Corrino of Corrino Empire
Dari kode di atas bisa dilihat perbedaan dari sisi pembuatan object dan pengaksesan method antara p2
dan p4
.
- Instance object
p2
dibuat via constructorClanHouse()
- Instance object
p4
dibuat via class methodcreate()
- Dari kedua object, diakses method
info()
Yang menarik untuk dibahas adalah p5
. Object p5
dibuat dari pemanggilan class method create()
namun pengaksesannya adalah via instance object p2
. Penulisan seperti itu diperbolehkan. Parameter cls
pada class method create()
akan terisi dengan nilai tipe data class object p2
(yaitu ClanHouse
).
A.38.4. Pengaksesan instance method via class
Jika class method bisa diakses via instance object, instance method juga bisa diakses via Class. Caranya cukup panggil instance method via class lalu isi parameter self
dengan instance object. Contoh:
p2 = ClanHouse("Lady Jessica", "Bene Gesserit")
ClanHouse.info(p2)
# output ➜ Lady Jessica of Bene Gesserit
p4 = ClanHouse.create("Glossu Rabban", "House of Harkonnen")
ClanHouse.info(p4)
# output ➜ Glossu Rabban of House of Harkonnen
p5 = p2.create("Irulan Corrino", "Corrino Empire")
ClanHouse.info(p5)
# output ➜ Irulan Corrino of Corrino Empire
Pengaksesan instance method via class mengharuskan parameter self
milik method untuk diisi dengan object. Hal ini berbeda dibanding pengaksesan instance method via instance object dimana parameter self
otomatis terisi nilai instance object.
A.38.5. Pengaksesan class attribute via cls
Pada chapter sebelumnya, OOP ➜ Instance Attribute & Class Attribute, kita telah mempelajari tentang perbedaan instance attribute dibanding class attribute.
Class attribute bisa diakses via instance object maupun class. Dalam konteks class method dimana cls
adalah berisi tipe data class, pengaksesan class attribute memungkinkan untuk dilakukan via variabel cls
.
Contoh penerapannya bisa dilihat pada kode berikut:
class ClanHouse:
note = "ClanHouse: a class to represent clan house in Dune universe"
def __init__(self, name = "", house = ""):
self.name = name
self.house = house
@classmethod
def create(cls, name = "", house = ""):
print("#1", cls.note)
obj = cls(name, house)
print("#2", obj.note)
return obj
p2 = ClanHouse.create("Lady Jessica", "Bene Gesserit")
print("#3", p2.note)
print("#4", ClanHouse.note)
Output program:
A.38.6. Summary
Dari banyak hal yang telah dipelajari di chapter ini, secara garis besar perbedaan antara constructor, instance method, dan class method bisa dilihat di bawah ini:
◉ Constructor
- Fungsi dideklarasikan di dalam block
class
- Deklarasinya menggunakan nama fungsi
__init__()
- Parameter pertama harus
self
, berisi instance object - Pemanggilan constructor mengembalikan instance object
- Pengaksesannya via pemanggilan nama class, contoh:
ClanHouse()
◉ Instance method
- Fungsi dideklarasikan di dalam block
class
- Parameter pertama harus
self
, berisi instance object - Pengaksesan instance method:
- Via instance object, contoh:
p2.info()
- Via class dengan menyisipkan instance object sebagai argument pemanggilan. contoh:
ClanHouse.info(p2)
- Via instance object, contoh:
◉ Class method
- Fungsi dideklarasikan di dalam block
class
- Fungsi memiliki decorator
@classmethod
- Parameter pertama harus
cls
, berisi tipe data class - Pengaksesan class method:
- Via class, contoh:
ClanHouse.create()
- Via instance object, contoh:
p2.create()
- Via class, contoh:
Catatan chapter 📑
◉ Source code praktik
github.com/novalagung/dasarpemrogramanpython-example/../class-method
◉ Chapter relevan lainnya
- OOP ➜ Class & Object
- OOP ➜ Instance Method
- OOP ➜ Constructor
- OOP ➜ Static Method
- Function ➜ Decorator
- OOP ➜ Abstract Method