Python
Halaman SebelumnyaHalaman Berikutnya
Python telah menjadi bahasa berorientasi objek sejak ada. Karena itu, membuat dan menggunakan kelas dan objek sangat mudah. Bab ini membantu Anda menjadi ahli dalam menggunakan dukungan pemrograman berorientasi objek Python.
Jika Anda tidak memiliki pengalaman sebelumnya dengan pemrograman berorientasi objek (OO), Anda mungkin ingin berkonsultasi dengan kursus pengantar atau setidaknya semacam tutorial sehingga Anda memiliki pemahaman konsep dasar.
Namun, di sini ada sedikit pengenalan Pemrograman Berorientasi Objek (OOP) untuk mempercepat Anda
Kelas Prototipe yang ditentukan pengguna untuk objek yang mendefinisikan satu set atribut yang mencirikan objek apa pun dari kelas. Atributnya adalah anggota data (variabel kelas dan variabel instan) dan metode, diakses melalui notasi titik.
Variabel kelas Variabel yang digunakan bersama oleh semua instance kelas. Variabel kelas didefinisikan di dalam kelas tetapi di luar metode kelas mana pun. Variabel kelas tidak digunakan sesering variabel instan.
Anggota data Variabel kelas atau variabel instan yang menyimpan data yang terkait dengan kelas dan objeknya.
Fungsi kelebihan beban Penugasan lebih dari satu perilaku ke fungsi tertentu. Operasi yang dilakukan bervariasi menurut jenis objek atau argumen yang terlibat.
Variabel instans Variabel yang didefinisikan di dalam metode dan hanya dimiliki oleh instance kelas saat ini.
Warisan Pemindahan karakteristik kelas ke kelas lain yang diturunkan darinya.
Contoh Objek individu dari kelas tertentu. Objek objek yang termasuk dalam kelas Lingkaran, misalnya, adalah turunan dari kelas Lingkaran.
Instansiasi Pembuatan instance kelas.
Metode Jenis fungsi khusus yang didefinisikan dalam definisi kelas.
Objek Instance unik dari struktur data yang ditentukan oleh kelasnya. Sebuah objek terdiri dari anggota data (variabel kelas dan variabel instan) dan metode.
Operator kelebihan beban Penugasan lebih dari satu fungsi ke operator tertentu.
Kelas pernyataan menciptakan definisi kelas baru. Nama kelas langsung mengikuti kata kunci kelas diikuti oleh titik dua sebagai berikut
class ClassName: 'Optional class documentation string' class_suite
Kelas memiliki string dokumentasi, yang dapat diakses melalui ClassName.__doc__ .
class_suite terdiri dari semua pernyataan komponen yang mendefinisikan anggota kelas, atribut data, dan fungsi.
Berikut adalah contoh kelas Python sederhana
class Employee: 'Common base class for all employees' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print "Total Employee %d" % Employee.empCount def displayEmployee(self): print "Name : ", self.name, ", Salary: ", self.salary
Variabel empCount adalah variabel kelas yang nilainya dibagi di antara semua instance kelas ini. Ini dapat diakses sebagai Employee.empCount dari dalam kelas atau dari luar kelas.
Metode pertama __init__() adalah metode khusus, yang disebut konstruktor kelas atau metode inisialisasi yang dipanggil Python saat Anda membuat instance baru dari kelas ini.
Anda mendeklarasikan metode kelas lain seperti fungsi normal dengan pengecualian bahwa argumen pertama untuk setiap metode adalah self . Python menambahkan diri argumen ke daftar untuk Anda; Anda tidak perlu menyertakannya saat memanggil metode.
Untuk membuat instance kelas, Anda memanggil kelas menggunakan nama kelas dan meneruskan argumen apa pun __init__ metode menerima.
"This would create first object of Employee class" emp1 = Employee("Zara", 2000) "This would create second object of Employee class" emp2 = Employee("Manni", 5000)
Anda mengakses atribut objek menggunakan operator titik dengan objek. Variabel kelas akan diakses menggunakan nama kelas sebagai berikut −
emp1.displayEmployee() emp2.displayEmployee() print "Total Employee %d" % Employee.empCount
Sekarang, gabungkan semua konsep
Demo Langsung#!/usr/bin/python class Employee: 'Common base class for all employees' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print "Total Employee %d" % Employee.empCount def displayEmployee(self): print "Name : ", self.name, ", Salary: ", self.salary "This would create first object of Employee class" emp1 = Employee("Zara", 2000) "This would create second object of Employee class" emp2 = Employee("Manni", 5000) emp1.displayEmployee() emp2.displayEmployee() print "Total Employee %d" % Employee.empCount
Ketika kode di atas dijalankan, menghasilkan hasil sebagai berikut
Name : Zara ,Salary: 2000 Name : Manni ,Salary: 5000 Total Employee 2
Anda dapat menambahkan, menghapus, atau mengubah atribut kelas dan objek kapan saja −
emp1.age = 7 # Add an 'age' attribute. emp1.age = 8 # Modify 'age' attribute. del emp1.age # Delete 'age' attribute.
Alih-alih menggunakan pernyataan normal untuk mengakses atribut, Anda dapat menggunakan fungsi berikut −
getattr(obj, nama[, default]) untuk mengakses atribut objek.
hasattr(obj,nama) untuk memeriksa apakah ada atribut atau tidak.
setattr(obj,nama,nilai) untuk mengatur atribut. Jika atribut tidak ada, maka akan dibuat.
delattr(obj, nama) untuk menghapus atribut.
hasattr(emp1, 'age') # Returns true if 'age' attribute exists getattr(emp1, 'age') # Returns value of 'age' attribute setattr(emp1, 'age', 8) # Set attribute 'age' at 8 delattr(empl, 'age') # Delete attribute 'age'
Setiap kelas Python terus mengikuti atribut bawaan dan mereka dapat diakses menggunakan operator titik seperti atribut lainnya −
__dict__ Kamus yang berisi namespace kelas.
__doc__ String dokumentasi kelas atau tidak sama sekali, jika tidak ditentukan.
__nama__ Nama kelas.
__modul__ Nama modul di mana kelas didefinisikan. Atribut ini adalah "__main__" dalam mode interaktif.
__basis__ Tuple yang mungkin kosong berisi kelas dasar, dalam urutan kemunculannya dalam daftar kelas dasar.
Untuk kelas di atas mari kita coba mengakses semua atribut ini
Demo Langsung#!/usr/bin/python class Employee: 'Common base class for all employees' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print "Total Employee %d" % Employee.empCount def displayEmployee(self): print "Name : ", self.name, ", Salary: ", self.salary print "Employee.__doc__:", Employee.__doc__ print "Employee.__name__:", Employee.__name__ print "Employee.__module__:", Employee.__module__ print "Employee.__bases__:", Employee.__bases__ print "Employee.__dict__:", Employee.__dict__
Ketika kode di atas dijalankan, menghasilkan hasil sebagai berikut
Employee.__doc__: Common base class for all employees Employee.__name__: Employee Employee.__module__: __main__ Employee.__bases__: () Employee.__dict__: {'__module__': '__main__', 'displayCount': <function displayCount at 0xb7c84994>, 'empCount': 2, 'displayEmployee': <function displayEmployee at 0xb7c8441c>, '__doc__': 'Common base class for all employees', '__init__': <function __init__ at 0xb7c846bc>}
Python menghapus objek yang tidak dibutuhkan (tipe bawaan atau instance kelas) secara otomatis untuk mengosongkan ruang memori. Proses dimana Python secara berkala mengambil kembali blok memori yang tidak lagi digunakan disebut Pengumpulan Sampah.
Pengumpul sampah Python berjalan selama eksekusi program dan dipicu ketika jumlah referensi objek mencapai nol. Jumlah referensi objek berubah saat jumlah alias yang mengarah ke objek tersebut berubah.
Jumlah referensi objek meningkat ketika diberi nama baru atau ditempatkan dalam wadah (daftar, tupel, atau kamus). Jumlah referensi objek berkurang saat dihapus dengan del , referensinya dipindahkan, atau referensinya keluar dari cakupan. Saat jumlah referensi objek mencapai nol, Python mengumpulkannya secara otomatis.
a = 40 # Create object <40> b = a # Increase ref. count of <40> c = [b] # Increase ref. count of <40> del a # Decrease ref. count of <40> b = 100 # Decrease ref. count of <40> c[0] = -1 # Decrease ref. count of <40>
Anda biasanya tidak akan melihat ketika pengumpul sampah menghancurkan instance yatim piatu dan merebut kembali ruangnya. Tetapi sebuah kelas dapat mengimplementasikan metode khusus __del__() , yang disebut destructor, yang dipanggil saat instance akan dimusnahkan. Metode ini mungkin digunakan untuk membersihkan semua sumber daya non-memori yang digunakan oleh sebuah instance.
Destruktor __del__() ini mencetak nama kelas dari instance yang akan dimusnahkan −
Demo Langsung#!/usr/bin/python class Point: def __init__( self, x=0, y=0): self.x = x self.y = y def __del__(self): class_name = self.__class__.__name__ print class_name, "destroyed" pt1 = Point() pt2 = pt1 pt3 = pt1 print id(pt1), id(pt2), id(pt3) # prints the ids of the obejcts del pt1 del pt2 del pt3
Ketika kode di atas dijalankan, menghasilkan hasil sebagai berikut
3083401324 3083401324 3083401324 Point destroyed
Catatan Idealnya, Anda harus mendefinisikan kelas Anda dalam file terpisah, kemudian Anda harus mengimpornya ke dalam file program utama Anda menggunakan import pernyataan.
Daripada memulai dari awal, Anda dapat membuat kelas dengan menurunkannya dari kelas yang sudah ada sebelumnya dengan mencantumkan kelas induk dalam tanda kurung setelah nama kelas baru.
Kelas anak mewarisi atribut dari kelas induknya, dan Anda dapat menggunakan atribut tersebut seolah-olah mereka didefinisikan di kelas anak. Kelas anak juga dapat menimpa anggota data dan metode dari induknya.
Kelas turunan dideklarasikan seperti kelas induknya; namun, daftar kelas dasar yang akan diwarisi diberikan setelah nama kelas −
class SubClassName (ParentClass1[, ParentClass2, ...]): 'Optional class documentation string' class_suite
#!/usr/bin/python class Parent: # define parent class parentAttr = 100 def __init__(self): print "Calling parent constructor" def parentMethod(self): print 'Calling parent method' def setAttr(self, attr): Parent.parentAttr = attr def getAttr(self): print "Parent attribute :", Parent.parentAttr class Child(Parent): # define child class def __init__(self): print "Calling child constructor" def childMethod(self): print 'Calling child method' c = Child() # instance of child c.childMethod() # child calls its method c.parentMethod() # calls parent's method c.setAttr(200) # again call parent's method c.getAttr() # again call parent's method
Ketika kode di atas dijalankan, menghasilkan hasil sebagai berikut
Calling child constructor Calling child method Calling parent method Parent attribute : 200
Cara yang sama, Anda dapat mengarahkan kelas dari beberapa kelas induk sebagai berikut −
class A: # define your class A ..... class B: # define your class B ..... class C(A, B): # subclass of A and B .....
Anda dapat menggunakan fungsi issubclass() atau isinstance() untuk memeriksa hubungan dua kelas dan instance.
issubclass(sub, sup) fungsi boolean mengembalikan nilai true jika subkelas yang diberikan sub memang subclass dari superclass sup .
instance(obj, Class) fungsi boolean mengembalikan nilai true jika obj adalah turunan dari kelas Kelas atau merupakan turunan dari subkelas Kelas
Anda selalu dapat mengganti metode kelas induk Anda. Salah satu alasan untuk mengganti metode induk adalah karena Anda mungkin menginginkan fungsionalitas khusus atau berbeda di subkelas Anda.
#!/usr/bin/python class Parent: # define parent class def myMethod(self): print 'Calling parent method' class Child(Parent): # define child class def myMethod(self): print 'Calling child method' c = Child() # instance of child c.myMethod() # child calls overridden method
Ketika kode di atas dijalankan, menghasilkan hasil sebagai berikut
Calling child method
Tabel berikut mencantumkan beberapa fungsi umum yang dapat Anda timpa di kelas Anda sendiri −
No.No. | Metode, Deskripsi &Contoh Panggilan |
---|---|
1 | __init__ ( diri [,args...] ) Konstruktor (dengan argumen opsional apa pun) Contoh Panggilan :obj =className(args) |
2 | __del__( sendiri ) Destructor, menghapus objek Contoh Panggilan :del obj |
3 | __repr__( mandiri ) Representasi string yang dapat dievaluasi Contoh Panggilan :repr(obj) |
4 | __str__( sendiri ) Representasi string yang dapat dicetak Contoh Panggilan :str(obj) |
5 | __cmp__ ( sendiri, x ) Perbandingan objek Contoh Panggilan :cmp(obj, x) |
Misalkan Anda telah membuat kelas Vektor untuk mewakili vektor dua dimensi, apa yang terjadi ketika Anda menggunakan operator plus untuk menambahkannya? Kemungkinan besar Python akan meneriaki Anda.
Namun, Anda dapat menentukan __add__ metode di kelas Anda untuk melakukan penjumlahan vektor dan kemudian operator plus akan berperilaku sesuai harapan −
#!/usr/bin/python class Vector: def __init__(self, a, b): self.a = a self.b = b def __str__(self): return 'Vector (%d, %d)' % (self.a, self.b) def __add__(self,other): return Vector(self.a + other.a, self.b + other.b) v1 = Vector(2,10) v2 = Vector(5,-2) print v1 + v2
Ketika kode di atas dijalankan, menghasilkan hasil sebagai berikut
Vector(7,8)
Atribut objek mungkin atau mungkin tidak terlihat di luar definisi kelas. Anda perlu memberi nama atribut dengan awalan garis bawah ganda, dan atribut tersebut tidak dapat dilihat langsung oleh orang luar.
#!/usr/bin/python class JustCounter: __secretCount = 0 def count(self): self.__secretCount += 1 print self.__secretCount counter = JustCounter() counter.count() counter.count() print counter.__secretCount
Ketika kode di atas dijalankan, menghasilkan hasil sebagai berikut
1 2 Traceback (most recent call last): File "test.py", line 12, in <module> print counter.__secretCount AttributeError: JustCounter instance has no attribute '__secretCount'
Python melindungi anggota tersebut dengan mengubah nama secara internal untuk memasukkan nama kelas. Anda dapat mengakses atribut seperti object._className__attrName . Jika Anda akan mengganti baris terakhir Anda sebagai berikut, maka itu akan berhasil untuk Anda
......................... print counter._JustCounter__secretCount
Ketika kode di atas dijalankan, menghasilkan hasil sebagai berikut
1 2 2
Python
C# didasarkan pada bahasa pemrograman C++. Oleh karena itu, bahasa pemrograman C# memiliki dukungan bawaan untuk kelas dan objek. Kelas tidak lain adalah enkapsulasi properti dan metode yang digunakan untuk mewakili entitas waktu nyata. Misalnya, jika Anda ingin bekerja dengan data karyawan di apli
OOP dengan Python OOP dengan Python adalah pendekatan pemrograman yang berfokus pada penggunaan objek dan kelas yang sama dengan bahasa pemrograman umum lainnya. Objek dapat berupa entitas dunia nyata apa pun. Python memungkinkan pengembang untuk mengembangkan aplikasi menggunakan pendekatan OOP de
Slot kelas Python adalah fitur yang tidak banyak diketahui oleh programmer. Di kelas slotted, kami secara eksplisit mendefinisikan bidang yang diizinkan untuk dimiliki oleh kelas kami menggunakan nama bidang ajaib __slots__ . Ini memiliki beberapa keuntungan: Objek yang dibuat dari kelas akan memak
Kelas data Python adalah kelas Python biasa yang memiliki @dataclass penghias. Ini khusus dibuat untuk menyimpan data. Sejak Python versi 3.7, Python menawarkan kelas data melalui modul bawaan yang disebut dataclass . Ada beberapa keunggulan dibandingkan kelas Python biasa yang akan kita jelajahi di