Tutorial ini menjelajahi fitur inti berorientasi objek Python, memandu Anda melalui pembuatan kelas, instantiasi, dan praktik terbaik untuk kode yang kuat.
Video: Python Classes and Objects
Python Objects and Classes
Python secara fundamental berorientasi objek. Sementara pemrograman prosedural berfokus pada fungsi, OOP berpusat pada objek yang menggabungkan data dan perilaku.
Sebuah objek adalah sekumpulan atribut (data) dan metode (fungsi). Sebuah kelas adalah cetak biru yang mendefinisikan struktur objek.
Bayangkan kelas sebagai cetak biru rumah—merinci kamar, pintu, jendela. Setiap rumah yang dibangun adalah objek, atau instance, yang dibuat dari cetak biru tersebut.
Banyak objek dapat dibuat dari kelas yang sama. Instantiasi adalah proses pembuatan objek dari kelas.
Mendefinisikan Kelas di Python
Definisi kelas dimulai dengan kata kunci class, mencerminkan cara fungsi dimulai dengan def. String pertama dalam kelas adalah docstring, yang memberikan deskripsi ringkas.
class MyNewClass:
'''This is a docstring. I have created a new class'''
pass
Mendefinisikan kelas menciptakan namespace baru untuk atributnya, yang dapat berupa data atau metode. Atribut khusus yang dimulai dengan garis bawah ganda, seperti __doc__, menyimpan metadata seperti docstring.
Setelah didefinisikan, objek kelas dibuat dan dapat digunakan untuk mengakses atribut atau membuat objek baru.
class Person:
"This is a person class"
age = 10
def greet(self):
print('Hello')
# Output: 10
print(Person.age)
# Output: <function Person.greet>
print(Person.greet)
# Output: "This is a person class"
print(Person.__doc__)
Output
10 <function Person.greet at 0x7fc78c6e8160> This is a person class
Membuat Objek di Python
Kelas berfungsi sebagai pabrik untuk objek. Instantiasi mirip dengan pemanggilan fungsi:
>>> harry = Person()
Objek yang dihasilkan harry dapat mengakses atribut kelas melalui notasi titik. Metode kelas menjadi metode bound pada instance.
class Person:
"This is a person class"
age = 10
def greet(self):
print('Hello')
# create a new object of Person class
harry = Person()
# Output: <function Person.greet>
print(Person.greet)
# Output: <bound method Person.greet of <__main__.Person object>>
print(harry.greet)
# Calling object's greet() method
# Output: Hello
harry.greet()
Output
<function Person.greet at 0x7fd288e4e160> <bound method Person.greet of <__main__.Person object at 0x7fd288e9fa30>> Hello
Perhatikan parameter self dalam definisi metode. Saat metode dipanggil pada instance, Python secara otomatis melewatkan instance sebagai argumen pertama, memungkinkan harry.greet() dieksekusi tanpa menyediakan self secara eksplisit.
Menurut konvensi, self digunakan, meskipun nama apa pun valid secara sintaks. Mengikuti konvensi ini meningkatkan keterbacaan dan selaras dengan standar komunitas.
Konstruktor di Python
Metode khusus yang diawali dengan garis bawah ganda memerankan peran khusus. Metode __init__, dipanggil saat instantiasi, bertindak sebagai konstruktor, menginisialisasi status instance.
class ComplexNumber:
def __init__(self, r=0, i=0):
self.real = r
self.imag = i
def get_data(self):
print(f'{self.real}+{self.imag}j')
# Create a new ComplexNumber object
num1 = ComplexNumber(2, 3)
# Call get_data() method
# Output: 2+3j
num1.get_data()
# Create another ComplexNumber object
# and add a dynamic attribute 'attr'
num2 = ComplexNumber(5)
num2.attr = 10
# Output: (5, 0, 10)
print((num2.real, num2.imag, num2.attr))
# Accessing a missing attribute raises an error
print(num1.attr)
Output
2+3j (5, 0, 10) Traceback (most recent call last): File "<string>", line 27, in <module> print(num1.attr) AttributeError: 'ComplexNumber' object has no attribute 'attr'
Contoh ini menunjukkan bahwa atribut dapat ditambahkan secara dinamis ke instance individual tanpa mempengaruhi yang lain.
Menghapus Atribut dan Objek
Atribut dapat dihapus dengan pernyataan del. Menghapus metode atau atribut kelas mempengaruhi panggilan selanjutnya.
>>> num1 = ComplexNumber(2,3)
>>> del num1.imag
>>> num1.get_data()
Traceback (most recent call last):
... AttributeError: 'ComplexNumber' object has no attribute 'imag'
>>> del ComplexNumber.get_data
>>> num1.get_data()
Traceback (most recent call last):
... AttributeError: 'ComplexNumber' object has no attribute 'get_data'
Objek itu sendiri dapat dihapus. Menghapus referensi membebaskan nama; jika tidak ada referensi lain, objek secara otomatis di-garbage-collect.
>>> c1 = ComplexNumber(1,3)
>>> del c1
>>> c1
Traceback (most recent call last):
... NameError: name 'c1' is not defined
Di Python, manajemen memori ditangani oleh reference counting dan garbage collector siklus, memastikan pembersihan sumber daya yang efisien.