Python Berorientasi Objek - Balok Penyusun

Pada bab ini, kita akan membahas istilah-istilah berorientasi objek dan konsep pemrograman secara mendetail. Class hanyalah sebuah pabrik untuk sebuah instance. Pabrik ini berisi cetak biru yang menjelaskan cara membuat instance. Sebuah contoh atau objek dibangun dari kelas. Dalam kebanyakan kasus, kita dapat memiliki lebih dari satu contoh kelas. Setiap instance memiliki sekumpulan atribut dan atribut ini ditentukan dalam sebuah kelas, sehingga setiap instance dari kelas tertentu diharapkan memiliki atribut yang sama.

Kumpulan Kelas: Perilaku dan Negara

Kelas akan membiarkan Anda menggabungkan perilaku dan status suatu objek. Amati diagram berikut untuk pemahaman yang lebih baik -

Poin-poin berikut ini patut diperhatikan ketika membahas bundel kelas -

  • Kata behavior identik dengan function - itu adalah potongan kode yang melakukan sesuatu (atau mengimplementasikan perilaku)

  • Kata state identik dengan variables - Ini adalah tempat untuk menyimpan nilai di dalam kelas.

  • Ketika kita menegaskan perilaku kelas dan status bersama, itu berarti bahwa kelas mengemas fungsi dan variabel.

Kelas memiliki metode dan atribut

Di Python, membuat metode mendefinisikan perilaku kelas. Metode kata adalah nama OOP yang diberikan ke fungsi yang didefinisikan di dalam kelas. Singkatnya -

  • Class functions - adalah sinonim untuk methods

  • Class variables - adalah sinonim untuk name attributes.

  • Class - cetak biru untuk sebuah contoh dengan perilaku yang tepat.

  • Object - salah satu contoh kelas, melakukan fungsionalitas yang ditentukan di kelas.

  • Type - menunjukkan kelas tempat instance tersebut berada

  • Attribute - Nilai objek apa pun: object.attribute

  • Method - "atribut yang dapat dipanggil" yang ditentukan di kelas

Perhatikan potongan kode berikut misalnya -

var = “Hello, John”
print( type (var)) # ‘str’> or <class 'str'>
print(var.upper()) # upper() method is called, HELLO, JOHN

Penciptaan dan Instansiasi

Kode berikut menunjukkan cara membuat kelas pertama kita dan kemudian contohnya.

class MyClass(object):
   pass
# Create first instance of MyClass
this_obj = MyClass()
print(this_obj)
# Another instance of MyClass
that_obj = MyClass()
print (that_obj)

Di sini kami telah membuat kelas yang disebut MyClassdan yang tidak melakukan tugas apa pun. Argumenobject di MyClass class melibatkan warisan kelas dan akan dibahas di bab-bab selanjutnya. pass pada kode di atas menunjukkan bahwa blok ini kosong, itu adalah definisi kelas kosong.

Mari kita buat sebuah instance this_obj dari MyClass() kelas dan cetak seperti yang ditunjukkan -

<__main__.MyClass object at 0x03B08E10>
<__main__.MyClass object at 0x0369D390>

Di sini, kami telah membuat instance dari MyClass.Kode hex mengacu pada alamat tempat objek disimpan. Contoh lain menunjuk ke alamat lain.

Sekarang mari kita definisikan satu variabel di dalam kelas MyClass() dan dapatkan variabel dari instance kelas itu seperti yang ditunjukkan pada kode berikut -

class MyClass(object):
   var = 9

# Create first instance of MyClass
this_obj = MyClass()
print(this_obj.var)

# Another instance of MyClass

that_obj = MyClass()
print (that_obj.var)

Keluaran

Anda dapat mengamati keluaran berikut ketika Anda menjalankan kode yang diberikan di atas -

9
9

Sebagai contoh tahu dari kelas mana itu dipakai, jadi ketika diminta untuk atribut dari sebuah instance, instance tersebut mencari atribut dan kelasnya. Ini disebutattribute lookup.

Metode Instance

Fungsi yang didefinisikan di dalam kelas disebut a method.Metode instance memerlukan sebuah instance untuk memanggilnya dan tidak memerlukan dekorator. Saat membuat metode instance, parameter pertama selaluself. Meskipun kita dapat menyebutnya (self) dengan nama lain, dianjurkan untuk menggunakan self, karena ini adalah konvensi penamaan.

class MyClass(object):
   var = 9
   def firstM(self):
      print("hello, World")
obj = MyClass()
print(obj.var)
obj.firstM()

Keluaran

Anda dapat mengamati keluaran berikut ketika Anda menjalankan kode yang diberikan di atas -

9
hello, World

Perhatikan bahwa dalam program di atas, kami mendefinisikan metode dengan self sebagai argumen. Tetapi kami tidak dapat memanggil metode ini karena kami belum menyatakan argumen apa pun untuk itu.

class MyClass(object):
   def firstM(self):
      print("hello, World")
      print(self)
obj = MyClass()
obj.firstM()
print(obj)

Keluaran

Anda dapat mengamati keluaran berikut ketika Anda menjalankan kode yang diberikan di atas -

hello, World
<__main__.MyClass object at 0x036A8E10>
<__main__.MyClass object at 0x036A8E10>

Enkapsulasi

Enkapsulasi adalah salah satu dasar OOP. OOP memungkinkan kami menyembunyikan kompleksitas kerja internal objek yang menguntungkan pengembang dengan cara berikut -

  • Menyederhanakan dan memudahkan pemahaman untuk menggunakan suatu objek tanpa mengetahui bagian dalamnya.

  • Perubahan apa pun dapat dengan mudah dikelola.

Pemrograman berorientasi objek sangat bergantung pada enkapsulasi. Istilah enkapsulasi dan abstraksi (juga disebut penyembunyian data) sering digunakan sebagai sinonim. Mereka hampir identik, karena abstraksi dicapai melalui enkapsulasi.

Enkapsulasi memberi kita mekanisme untuk membatasi akses ke beberapa komponen objek, ini berarti representasi internal suatu objek tidak dapat dilihat dari luar definisi objek. Akses ke data ini biasanya dicapai melalui metode khusus -Getters dan Setters.

Data ini disimpan dalam atribut instance dan dapat dimanipulasi dari manapun di luar kelas. Untuk mengamankannya, data tersebut hanya boleh diakses menggunakan metode instance. Akses langsung seharusnya tidak diizinkan.

class MyClass(object):
   def setAge(self, num):
      self.age = num

   def getAge(self):
      return self.age

zack = MyClass()
zack.setAge(45)
print(zack.getAge())

zack.setAge("Fourty Five")
print(zack.getAge())

Keluaran

Anda dapat mengamati keluaran berikut ketika Anda menjalankan kode yang diberikan di atas -

45
Fourty Five

Data harus disimpan hanya jika sudah benar dan valid, menggunakan konstruksi penanganan Exception. Seperti yang bisa kita lihat di atas, tidak ada batasan pada input pengguna ke metode setAge (). Bisa berupa string, angka, atau daftar. Jadi kita perlu memeriksa kode di atas untuk memastikan kebenaran disimpan.

class MyClass(object):
   def setAge(self, num):
      self.age = num

   def getAge(self):
      return self.age
zack = MyClass()
zack.setAge(45)
print(zack.getAge())
zack.setAge("Fourty Five")
print(zack.getAge())

Pembuat Init

__initMetode __ secara implisit dipanggil segera setelah sebuah objek kelas dibuat, Ini akan menginisialisasi objek.

x = MyClass()

Baris kode yang ditunjukkan di atas akan membuat instance baru dan menetapkan objek ini ke variabel lokal x.

Operasi instantiation, yaitu calling a class object, membuat objek kosong. Banyak kelas suka membuat objek dengan contoh yang disesuaikan dengan keadaan awal tertentu. Oleh karena itu, kelas dapat mendefinisikan metode khusus bernama '__init __ ()' seperti yang ditunjukkan -

def __init__(self):
   self.data = []

Python memanggil __init__ selama pembuatan instance untuk mendefinisikan atribut tambahan yang harus terjadi ketika kelas dibuat yang mungkin menyiapkan beberapa nilai awal untuk objek itu atau menjalankan rutinitas yang diperlukan pada pembuatan instance. Jadi dalam contoh ini, instance baru yang diinisialisasi dapat diperoleh dengan -

x = MyClass()

Metode __init __ () dapat memiliki satu atau beberapa argumen untuk fleksibilitas yang lebih besar. Init singkatan dari inisialisasi, karena inisialisasi atribut dari instance. Ini disebut konstruktor kelas.

class myclass(object):
   def __init__(self,aaa, bbb):
      self.a = aaa
      self.b = bbb

x = myclass(4.5, 3)
print(x.a, x.b)

Keluaran

4.5 3

Atribut Kelas

Atribut yang didefinisikan di kelas disebut “atribut kelas 'dan atribut yang ditentukan dalam fungsi disebut' atribut contoh '. Saat menentukan, atribut ini tidak diawali dengan sendirinya, karena ini adalah properti kelas dan bukan contoh tertentu.

Atribut kelas dapat diakses oleh kelas itu sendiri (className.attributeName) serta oleh instance kelas (inst.attributeName). Jadi, instance memiliki akses ke atribut instance serta atribut kelas.

>>> class myclass():
   age = 21
>>> myclass.age
21
>>> x = myclass()
>>> x.age
21
>>>

Atribut kelas dapat diganti dalam sebuah instance, meskipun itu bukan metode yang baik untuk memecahkan enkapsulasi.

Ada jalur pencarian untuk atribut dengan Python. Yang pertama adalah metode yang didefinisikan dalam kelas, dan kemudian kelas di atasnya.

>>> class myclass(object):
   classy = 'class value'
>>> dd = myclass()
>>> print (dd.classy) # This should return the string 'class value'
class value
>>>
>>> dd.classy = "Instance Value"
>>> print(dd.classy) # Return the string "Instance Value"
Instance Value
>>>
>>> # This will delete the value set for 'dd.classy' in the instance.
>>> del dd.classy
>>> >>> # Since the overriding attribute was deleted, this will print 'class
value'.

>>> print(dd.classy)
class value
>>>

Kami mengganti atribut kelas 'berkelas' dalam contoh dd. Saat diganti, interpreter Python membaca nilai yang diganti. Tapi begitu nilai baru dihapus dengan 'del', nilai yang diganti tidak lagi ada dalam instance, dan karenanya pencarian naik ke level di atas dan mendapatkannya dari kelas.

Bekerja dengan Data Kelas dan Instance

Di bagian ini, mari kita pahami bagaimana data kelas terkait dengan data instance. Kami dapat menyimpan data baik di kelas atau dalam sebuah instance. Saat kami mendesain kelas, kami memutuskan data mana yang termasuk dalam instance dan data mana yang harus disimpan ke dalam kelas keseluruhan.

Sebuah instance dapat mengakses data kelas. Jika kita membuat beberapa instance, maka instance ini dapat mengakses nilai atribut individualnya serta data kelas secara keseluruhan.

Jadi, data kelas adalah data yang dibagikan di antara semua instance. Perhatikan kode yang diberikan di bawah ini untuk pemahaman yang lebih baik -

class InstanceCounter(object):
   count = 0 # class attribute, will be accessible to all instances
   def __init__(self, val):
      self.val = val
      InstanceCounter.count +=1 # Increment the value of class attribute, accessible through class name
# In above line, class ('InstanceCounter') act as an object
   def set_val(self, newval):
      self.val = newval

   def get_val(self):
      return self.val

   def get_count(self):
      return InstanceCounter.count
a = InstanceCounter(9)
b = InstanceCounter(18)
c = InstanceCounter(27)

for obj in (a, b, c):
   print ('val of obj: %s' %(obj.get_val())) # Initialized value ( 9, 18, 27)
   print ('count: %s' %(obj.get_count())) # always 3

Keluaran

val of obj: 9
count: 3
val of obj: 18
count: 3
val of obj: 27
count: 3

Singkatnya, atribut kelas sama untuk semua instance kelas sedangkan atribut instance adalah khusus untuk setiap instance. Untuk dua contoh yang berbeda, kita akan memiliki dua atribut contoh yang berbeda.

class myClass:
   class_attribute = 99

   def class_method(self):
      self.instance_attribute = 'I am instance attribute'

print (myClass.__dict__)

Keluaran

Anda dapat mengamati keluaran berikut ketika Anda menjalankan kode yang diberikan di atas -

{'__module__': '__main__', 'class_attribute': 99, 'class_method': 
      
       , '__dict__': 
       
        , '__weakref__': 
        
         , '__doc__': None} 
        
       
      

The instance attribute myClass.__dict__ as shown −

>>> a = myClass()
>>> a.class_method()
>>> print(a.__dict__)
{'instance_attribute': 'I am instance attribute'}