Pemrograman berorientasi objek (OOP) adalah konsep yang banyak digunakan untuk menulis aplikasi. Sebagai data scientist, Anda sebaiknya mampu menulis aplikasi untuk memproses data, di antara berbagai hal lainnya.
Dalam tutorial ini, saya membahas dasar-dasar pemrograman berorientasi objek di Python. Anda akan belajar cara membuat class dan menginstansiasi objek, cara mendefinisikan method dan meneruskan argumen kepadanya, serta cara menambahkan atribut ke sebuah class.
Ringkasnya
OOP mengorganisasi kode berdasarkan class (cetak biru) dan objek (instans dari cetak biru tersebut)
Definisikan class dengan keyword
classdan inisialisasi atribut di dalam__init__(self)Instance method beroperasi pada data objek melalui
selfdan dipanggil dengan notasi titik:my_object.method()Python mendukung keempat pilar OOP: enkapsulasi, pewarisan, polimorfisme, dan abstraksi
OOP mendorong penggunaan ulang kode untuk membuat banyak objek dari satu templat class
Apa itu OOP?
Pemrograman berorientasi objek (OOP) didasarkan pada paradigma pemrograman imperatif, yang menggunakan pernyataan untuk mengubah status program. Imperatif berarti berfokus pada bagaimana program seharusnya berjalan. Contoh bahasa pemrograman imperatif adalah C, C++, Java, Go, Ruby, dan Python.
Ini berlawanan dengan pemrograman deklaratif, yang berfokus pada apa yang harus dicapai program komputer tanpa merinci bagaimana caranya (misalnya, SQL, XQuery). Untuk perbandingan paradigma, lihat panduan kami tentang functional programming vs. OOP.
OOP menggunakan konsep objek dan class. Class dapat dianggap sebagai 'cetak biru' untuk objek. Ini dapat memiliki
- Atribut: karakteristik yang dimiliki
- Method: aksi yang dilakukan
OOP memiliki beberapa keunggulan utama dibandingkan pola desain lainnya. Pengembangan sering kali lebih cepat dan murah, dan pendekatan modular membuat perangkat lunak lebih mudah dirawat. Ini pada gilirannya menghasilkan perangkat lunak berkualitas lebih tinggi, yang juga dapat diperluas dengan method dan atribut baru.
Namun, kurva pembelajarannya lebih panjang. Konsep inti memerlukan investasi awal lebih banyak untuk benar-benar dipahami. Secara komputasi, perangkat lunak OOP lebih lambat dan menggunakan lebih banyak memori karena lebih banyak baris kode yang harus ditulis.
Empat Pilar OOP
Di luar class dan method, OOP bertumpu pada empat pilar yang sejauh ini baru sedikit saya singgung. Masing-masing layak dibahas mendalam, tetapi berikut ikhtisar singkat dengan tautan ke tutorial khusus.
| Pilar | Artinya | Pelajari lebih lanjut |
|---|---|---|
| Enkapsulasi | Menggabungkan data dan method bersama, mengontrol akses dengan konvensi penamaan (_private, __name_mangled) | Encapsulation in Python |
| Pewarisan | Membuat child class yang menggunakan ulang dan memperluas perilaku parent class | Python Inheritance |
| Polimorfisme | Class berbeda berbagi antarmuka yang sama, sehingga kode dapat bekerja dengan objek secara saling menggantikan | OOP in Python course |
| Abstraksi | Menyembunyikan kompleksitas di balik antarmuka yang bersih menggunakan abstract base class | Python Abstract Classes |
Contoh OOP
Salah satu contoh class adalah class Dog. Jangan menganggapnya sebagai anjing tertentu, atau anjing Anda sendiri. Kita mendeskripsikan apa yang secara umum dimiliki dan dapat dilakukan oleh seekor anjing. Anjing biasanya punya name dan age; ini adalah atribut instans. Anjing juga bisa bark; ini adalah sebuah method.
Ketika Anda berbicara tentang anjing tertentu, Anda akan memiliki sebuah objek dalam pemrograman: objek adalah instansiasi dari sebuah class. Inilah prinsip dasar OOP. Jadi anjing saya, Ozzy, misalnya, termasuk class Dog. Atributnya adalah name = 'Ozzy' dan age = '2'. Anjing lain akan memiliki atribut yang berbeda.
OOP di Python
Python adalah salah satu bahasa paling populer untuk mempelajari dan menerapkan OOP. Di bawah ini, saya membahas apa yang membuat Python cocok untuk kode berorientasi objek dan menelusuri sintaks intinya.
Apakah Python berorientasi objek?
Python adalah bahasa pemrograman yang hebat dan mendukung OOP. Anda akan menggunakannya untuk mendefinisikan class dengan atribut dan method, yang kemudian akan Anda panggil.
Keunggulan utama Python dibandingkan bahasa lain seperti Java, C++ atau R adalah bahwa Python merupakan bahasa dinamis dengan tipe data tingkat tinggi. Artinya, programmer tidak perlu mendeklarasikan tipe variabel dan argumen, yang membuat pengembangan jauh lebih cepat dan kode lebih mudah dibaca dibandingkan Java atau C++.
Jika Anda baru mengenal Python, pastikan untuk melihat kursus Introduction to Python kami.
Cara membuat class
Untuk mendefinisikan class di Python, Anda dapat menggunakan class keyword, diikuti nama class dan titik dua.
Di dalam class, method __init__ (sebuah dunder method) biasanya didefinisikan dengan def. Ini adalah initializer yang nantinya dapat Anda gunakan untuk menginstansiasi objek. Ini mirip dengan constructor di Java.
__init__ dipanggil secara otomatis saat Anda membuat objek baru. Method ini menerima satu argumen: self, yang merujuk pada objek itu sendiri.
Di dalam method, keyword pass digunakan untuk saat ini, karena Python mengharapkan Anda menuliskan sesuatu di sana. Ingat untuk menggunakan indentasi yang benar!
class Dog:
def __init__(self):
passCatatan: self di Python setara dengan this di C++ atau Java.
Pada kasus ini, Anda memiliki class Dog (yang sebagian besar kosong), tetapi belum ada objek. Mari buat satu!
Menginstansiasi objek
Untuk menginstansiasi sebuah objek, ketik nama class, diikuti dua tanda kurung. Anda dapat menugaskannya ke variabel untuk melacak objek tersebut.
ozzy = Dog()
Dan cetak:
print(ozzy)
<__main__.Dog object at 0x111f47278>
Menambahkan atribut ke sebuah class
Setelah mencetak ozzy, jelas bahwa objek ini adalah seekor anjing. Namun Anda belum menambahkan atribut apa pun. Mari beri class Dog nama dan usia dengan menuliskannya ulang:
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
Anda dapat melihat bahwa fungsinya kini menerima dua argumen setelah self: name dan age. Keduanya kemudian ditetapkan ke self.name dan self.age. Anda sekarang dapat membuat objek ozzy baru dengan nama dan usia:
ozzy = Dog("Ozzy", 2)
Untuk mengakses atribut objek di Python, Anda dapat menggunakan notasi titik. Ini dilakukan dengan mengetik nama objek, diikuti titik dan nama atributnya
print(ozzy.name)
print(ozzy.age)
Ozzy
2
Ini juga dapat digabungkan dalam kalimat yang lebih lengkap:
print(ozzy.name + " is " + str(ozzy.age) + " year(s) old.")
Ozzy is 2 year(s) old.
Fungsi str() digunakan di sini untuk mengonversi atribut age, yang berupa integer, menjadi string, sehingga Anda dapat menggunakannya dalam fungsi print().
Mendefinisikan method dalam sebuah class
Sekarang Anda memiliki class Dog, class ini memang memiliki nama dan usia yang dapat Anda pantau, tetapi belum melakukan apa pun. Di sinilah instance method berperan. Anda dapat menulis ulang class untuk kini menyertakan method bark(). Perhatikan bagaimana keyword def digunakan lagi, serta argumen self.
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print("bark bark!")
Method bark kini dapat dipanggil dengan notasi titik, setelah menginstansiasi objek ozzy yang baru. Method ini akan mencetak "bark bark!" ke layar. Perhatikan tanda kurung pada .bark(). Ini selalu digunakan saat memanggil method. Tanda kurungnya kosong dalam kasus ini, karena method bark() tidak menerima argumen apa pun.
ozzy = Dog("Ozzy", 2)
ozzy.bark()
bark bark!
Ingat ketika Anda mencetak ozzy sebelumnya? Kode di bawah ini kini menerapkan fungsionalitas tersebut dalam class Dog, dengan method doginfo(). Anda kemudian menginstansiasi beberapa objek dengan properti berbeda dan memanggil method tersebut pada masing-masing objek.
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print("bark bark!")
def doginfo(self):
print(self.name + " is " + str(self.age) + " year(s) old.")
ozzy = Dog("Ozzy", 2)
skippy = Dog("Skippy", 12)
filou = Dog("Filou", 8)
ozzy.doginfo()
skippy.doginfo()
filou.doginfo()
Ozzy is 2 year(s) old.
Skippy is 12 year(s) old.
Filou is 8 year(s) old.
Seperti yang Anda lihat, Anda dapat memanggil method doginfo() pada objek dengan notasi titik. Responsnya kini bergantung pada objek Dog mana yang Anda panggil method-nya.
Karena anjing bertambah tua, akan lebih baik jika Anda bisa menyesuaikan usianya. Ozzy baru saja berusia 3 tahun, jadi mari ubah usianya.
ozzy.age = 3
print(ozzy.age)
3
Semudah menetapkan nilai baru ke atribut. Anda juga bisa menerapkan ini sebagai method birthday() dalam class Dog:
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print("bark bark!")
def doginfo(self):
print(self.name + " is " + str(self.age) + " year(s) old.")
def birthday(self):
self.age +=1
ozzy = Dog("Ozzy", 2)
print(ozzy.age)
2
ozzy.birthday()
print(ozzy.age)
3
Sekarang, Anda tidak perlu lagi mengubah usia anjing secara manual. Kapan pun ulang tahunnya, Anda cukup memanggil method birthday().
Meneruskan argumen ke method
Anda ingin anjing-anjing kita memiliki teman. Ini sebaiknya bersifat opsional karena tidak semua anjing suka bersosialisasi.
Lihat method setBuddy() di bawah. Method ini menerima self, seperti biasa, dan buddy sebagai argumen. Dalam hal ini, buddy akan menjadi objek Dog lain. Tetapkan atribut self.buddy ke buddy, dan atribut buddy.buddy ke self.
Ini berarti relasinya bersifat timbal balik; Anda adalah teman dari teman Anda. Dalam kasus ini, Filou akan menjadi teman Ozzy, yang berarti Ozzy otomatis menjadi teman Filou.
Anda juga bisa menetapkan atribut ini secara manual alih-alih mendefinisikan method, tetapi itu akan memerlukan lebih banyak pekerjaan (menulis dua baris kode alih-alih satu) setiap kali Anda ingin menetapkan seorang teman.
Perhatikan bahwa di Python, Anda tidak perlu menentukan tipe argumennya. Jika ini Java, itu akan diperlukan.
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print("bark bark!")
def doginfo(self):
print(self.name + " is " + str(self.age) + " year(s) old.")
def birthday(self):
self.age +=1
def setBuddy(self, buddy):
self.buddy = buddy
buddy.buddy = self
Sekarang Anda dapat memanggil method tersebut dengan notasi titik dan meneruskannya objek Dog lain. Dalam hal ini, teman Ozzy adalah Filou:
ozzy = Dog("Ozzy", 2)
filou = Dog("Filou", 8)
ozzy.setBuddy(filou)
Jika sekarang Anda ingin mendapatkan informasi tentang teman Ozzy, Anda dapat menggunakan notasi titik dua kali: Pertama, untuk merujuk pada teman Ozzy, dan kedua untuk merujuk pada atributnya.
print(ozzy.buddy.name)
print(ozzy.buddy.age)
Filou
8
Perhatikan bagaimana ini juga dapat dilakukan untuk Filou.
print(filou.buddy.name)
print(filou.buddy.age)
Ozzy
2
Method milik teman juga dapat dipanggil. Argumen self yang diteruskan ke doginfo() sekarang adalah ozzy.buddy, yaitu filou.
ozzy.buddy.doginfo()
Filou is 8 year(s) old.
Contoh OOP Python
Salah satu contoh di mana pemrograman berorientasi objek di Python berguna adalah tutorial Python For Finance: Algorithmic Trading kami. Di dalamnya, kami menjelaskan cara menyiapkan strategi trading untuk portofolio saham.
Strategi trading didasarkan pada moving average harga saham. Jika signals['short_mavg'][short_window:] > signals['long_mavg'][short_window:] terpenuhi, sebuah sinyal dibuat. Sinyal ini adalah prediksi untuk perubahan harga saham di masa depan.
Pada kode di bawah, Anda akan melihat bahwa ada inisialisasi terlebih dahulu, diikuti perhitungan moving average dan pembuatan sinyal. Karena ini bukan kode berorientasi objek, ini hanyalah satu potongan besar yang dieksekusi sekaligus.
Perhatikan bahwa kita menggunakan aapl pada contoh, yang merupakan ticker saham Apple. Jika Anda ingin melakukannya untuk saham lain, Anda harus menulis ulang kodenya.
# Initialize
short_window = 40
long_window = 100
signals = pd.DataFrame(index=aapl.index)
signals['signal'] = 0.0
# Create short simple moving average over the short window
signals['short_mavg'] = aapl['Close'].rolling(window=short_window, min_periods=1, center=False).mean()
# Create long simple moving average over the long window
signals['long_mavg'] = aapl['Close'].rolling(window=long_window, min_periods=1, center=False).mean()
# Create signals
signals['signal'][short_window:] = np.where(signals['short_mavg'][short_window:] > signals['long_mavg'][short_window:], 1.0, 0.0)
# Generate trading orders
signals['positions'] = signals['signal'].diff()
# Print `signals`
print(signals)
Dalam pendekatan berorientasi objek, Anda hanya perlu menulis kode inisialisasi dan pembuatan sinyal sekali.
Anda kemudian dapat membuat objek baru untuk setiap saham yang ingin Anda hitung strateginya, dan memanggil method generate_signals() pada objek tersebut. Perhatikan bahwa kode OOP sangat mirip dengan kode di atas, dengan tambahan self.
class MovingAverage():
def __init__(self, symbol, bars, short_window, long_window):
self.symbol = symbol
self.bars = bars
self.short_window = short_window
self.long_window = long_window
def generate_signals(self):
signals = pd.DataFrame(index=self.bars.index)
signals['signal'] = 0.0
signals['short_mavg'] = self.bars['Close'].rolling(window=self.short_window, min_periods=1, center=False).mean()
signals['long_mavg'] = bars['Close'].rolling(window=self.long_window, min_periods=1, center=False).mean()
signals['signal'][self.short_window:] = np.where(signals['short_mavg'][self.short_window:] > signals['long_mavg'][self.short_window:], 1.0, 0.0)
signals['positions'] = signals['signal'].diff()
return signals
Sekarang Anda cukup menginstansiasi sebuah objek dengan parameter yang Anda inginkan dan menghasilkan sinyal untuknya.
apple = MovingAverage('aapl', aapl, 40, 100)
print(apple.generate_signals())
Melakukan ini untuk saham lain menjadi sangat mudah. Ini hanya soal menginstansiasi objek baru dengan simbol saham yang berbeda.
microsoft = MovingAverage('msft', msft, 40, 100)
print(microsoft.generate_signals())
Pikiran Akhir
Kita telah membahas beberapa konsep utama OOP di Python. Anda kini tahu cara mendeklarasikan class dan method, menginstansiasi objek, menetapkan atributnya, dan memanggil instance method. Keterampilan ini akan berguna untuk karier Anda sebagai data scientist.
Untuk pendekatan yang lebih modern dalam mendefinisikan class, lihat Python data classes, yang mengurangi boilerplate code. Jika Anda ingin memperluas konsep kunci yang Anda perlukan untuk bekerja lebih lanjut dengan Python, pastikan untuk melihat kursus Intermediate Python kami.
Dengan OOP, kode Anda akan bertambah kompleks seiring program menjadi lebih besar. Anda akan memiliki berbagai class, subclass, objek, pewarisan, instance method, dan lainnya. Untuk skenario pewarisan yang kompleks, pelajari tentang multiple inheritance dan super().
FAQ OOP Python
Apa itu pemrograman berorientasi objek (OOP)?
Pemrograman berorientasi objek adalah paradigma pemrograman yang didasarkan pada konsep "objek", yang dapat berisi data dan kode yang memanipulasi data tersebut. Dalam OOP, objek dibuat dari templat yang disebut "class", yang mendefinisikan properti dan perilaku objek yang dibuatnya. OOP memungkinkan Anda membuat kode yang dapat digunakan kembali dan memodelkan konsep dunia nyata dengan lebih dekat, menjadikannya pilihan populer untuk banyak proyek perangkat lunak.
Apa itu class dan objek di Python?
Di Python, class adalah templat untuk membuat objek. Class mendefinisikan properti dan perilaku dari objek yang dibuat darinya. Objek adalah instans dari sebuah class, dibuat dengan memanggil class seperti fungsi. Objek berisi data dan perilaku yang didefinisikan oleh class, serta identitas yang unik.
Bagaimana cara mendefinisikan class di Python?
Untuk mendefinisikan class di Python, Anda menggunakan keyword class, diikuti nama class dan titik dua. Definisi class diindentasi, dan blok berindentasi tersebut memuat properti serta method (fungsi) yang menjadi bagian dari class.
Bagaimana cara membuat objek dari sebuah class di Python?
Untuk membuat objek dari sebuah class di Python, Anda memanggil class seperti fungsi, meneruskan argumen yang diperlukan ke constructor class (method __init__).
Apa saja empat pilar OOP di Python?
Empat pilar pemrograman berorientasi objek adalah: Enkapsulasi (menggabungkan data dan method sekaligus membatasi akses), Pewarisan (memungkinkan class mewarisi atribut dan method dari parent class), Polimorfisme (memungkinkan objek dari tipe berbeda diperlakukan secara seragam), dan Abstraksi (menyembunyikan detail implementasi yang kompleks sambil mengekspos fitur penting).
Apa perbedaan atribut class dan atribut instans?
Atribut class dibagikan oleh semua instans class dan didefinisikan langsung di badan class. Atribut instans bersifat unik untuk setiap objek dan didefinisikan di dalam method __init__ menggunakan self. Misalnya, semua anjing mungkin berbagi atribut class species, tetapi setiap anjing memiliki atribut instans name masing-masing.
