Python Super: Cara Menggunakan Fungsi Super () – Codewithaden

Python bukan murni bahasa yang berorientasi objek, dan cukup dapat diperluas dan cukup kuat untuk memungkinkan Anda membuat aplikasi Anda menggunakan paradigma yang berorientasi objek. Salah satu dari bagaimana Python mencapai ini adalah dengan mendukung warisan , yang terjadi super()

Fungsi super () mengembalikan proxy obyek , objek pengganti yang dapat memanggil metode kelas dasar melalui delegasi. Ini disebut tidak langsung, yang merupakan kemampuan untuk merujuk objek basis dengan super (). Fungsi super serbaguna dan dapat digunakan dengan berbagai cara.

Jika sebelumnya Anda telah bekerja pada bahasa OOP seperti PHP atau JavaScript, maka Super () Anda menemukan kata kunci super.

Python Super

Itu super() adalah bawaan Fungsi Python itu Mengembalikan objek proxy, memungkinkan Anda untuk merujuk ke kelas induk oleh ‘ super . ‘Fungsi super () memberi Anda akses ke metode dalam superclass dari subclass yang diwariskan darinya. Ini dapat digunakan untuk mendapatkan metode yang diwariskan, baik dari kelas induk atau saudara kandung.

Super () sendiri mengembalikan objek sementara superclass yang memungkinkan Anda untuk menyebut metode superclass itu.

Jika Python’s Super () inbuilt tidak membuat Anda kagum, kemungkinan Anda tidak tahu fungsi super apa yang mampu dilakukan atau bagaimana menggunakannya secara efektif.

Jika kita ingin memahami fungsi Python Super, kita perlu tahu tentang Warisan dalam Python . Dalam warisan Python, subkelas dapat mewarisi dari superclass.

Fungsi Python Super dapat merujuk ke superclass secara implisit. Jadi, fungsi Python Super () membuat tugas kita lebih mudah dikelola.

Saat mengacu pada superclass dari kelas dasar, kami tidak perlu menulis nama superclass secara eksplisit.

Metode Python Super () memungkinkan Anda untuk memanggil metode superclass di subkelas Anda. Kasus penggunaan utama dari ini adalah untuk memperluas fungsionalitas metode yang diwariskan.

Metode super () juga dapat mengambil dua parameter:

  1. Subkelas
  2. Objek yang merupakan instance dari subkelas itu.

Kami akan membahas python super () secara rinci di bagian berikut.

Mengapa menggunakan fungsi super () dalam python

Kami menggunakan fungsi super () karena itu Menyelamatkan Anda dari perlu menulis ulang metode -metode tersebut di subkelas Anda dan memungkinkan Anda menukar superclass dengan perubahan kode minimal. Fungsi super () mengembalikan objek sementara superclass yang memungkinkan Anda untuk menyebut metode superclass itu.

Cara memanggil fungsi super () dalam python 3

Ke panggilan sebuah fungsi super () di Python , Buat kelas orang tua dan anak dan mewarisi kelas orang tua ke kelas anak dan kemudian memanggil metode super () dari kelas anak. Pertama kita akan mengambil definisi kelas reguler dan memodifikasinya dengan menambahkan fungsi super.

class MyParentClass():
    def __init__(self):
        pass

class SubClass(MyParentClass):
    def __init__(self):
        super() 

Seperti yang Anda lihat, ini adalah pengaturan dasar dari warisan tunggal.

Kita dapat melihat bahwa ada kelas pangkalan atau orang tua (juga kadang -kadang disebut superclass ) dan kelas yang diturunkan atau subkelas, tetapi Kita masih perlu menginisialisasi kelas induk atau dasar dalam subkelas atau turunan atau anak.

Kita dapat memanggil fungsi super () untuk memproses lebih mudah diakses.

Tujuan dari fungsi super adalah untuk memberikan solusi yang jauh lebih abstrak dan portabel untuk menginisialisasi kelas.

Mari kita lihat contoh fungsi super () dalam python.

# app.py

class Computer():
    def __init__(self, computer, ram, ssd):
        self.computer = computer
        self.ram = ram
        self.ssd = ssd

class Laptop(Computer):
    def __init__(self, computer, ram, ssd, model):
        super().__init__(computer, ram, ssd)
        self.model = model

lenovo = Laptop('lenovo', 2, 512, 'l420')
print('This computer is:', lenovo.computer)
print('This computer has ram of', lenovo.ram)
print('This computer has ssd of', lenovo.ssd)
print('This computer has this model:', lenovo.model)
 

Dalam contoh di atas, kami telah mendefinisikan satu kelas dasar, komputer, dan kelas turunan, yang merupakan laptop.

Kami telah mendefinisikan tiga properti di dalam kelas dasar, dan kelas turunan memiliki empat properti.

Tiga properti dari kelas turunan berasal dari kelas dasar, dan yang keempat adalah properti itu sendiri. Selain itu, kelas turunan atau anak memilikinya model Properti. Tiga lainnya diperoleh dari komputer kelas dasar.

Jadi, jika kita hanya membuat objek dari kelas yang diturunkan, kita masih memiliki semua akses dasar properti kelas karena fungsi super ().

Output dari contoh di atas adalah sebagai berikut.

Python

Fungsi Python Super () dengan warisan tunggal

Warisan adalah konsep dalam pemrograman berorientasi objek di mana a kelas berasal (atau mewarisi ) atribut dan perilaku dari kelas lain tanpa perlu mengimplementasikannya lagi.

Lihat program berikut.

# app.py

class Rectangle:
    def __init__(self, length, width):
        self.length = length
        self.width = width

    def area(self):
        return self.length * self.width

    def perimeter(self):
        return 2 * self.length + 2 * self.width


class Square:
    def __init__(self, length):
        self.length = length

    def area(self):
        return self.length * self.length

    def perimeter(self):
        return 4 * self.length


sqr = Square(4)
print("Area of Square is:", sqr.area())

rect = Rectangle(2, 4)
print("Area of Rectangle is:", rect.area())
 

Lihat outputnya.

➜  pyt python3 app.py
Area of Square is: 16
Area of Rectangle is: 8
➜  pyt
 

Dalam contoh di atas, Anda memiliki dua bentuk yang terkait satu sama lain: kuadrat adalah jenis persegi panjang tertentu.

Kode, bagaimanapun, tidak mencerminkan hubungan antara kedua bentuk itu dan dengan demikian memiliki kode yang harus diulang. Jadi kita perlu menerapkan prinsip -prinsip kode dasar seperti jangan mengulangi diri sendiri.

Menggunakan cara warisan yang tepat dapat mengurangi jumlah kode yang Anda tulis sambil secara bersamaan mencerminkan hubungan dunia nyata antara bentuk-bentuk seperti persegi panjang dan kotak.

# app.py

class Rectangle:
    def __init__(self, length, width):
        self.length = length
        self.width = width

    def area(self):
        return self.length * self.width

    def perimeter(self):
        return 2 * self.length + 2 * self.width

class Square(Rectangle):
    def __init__(self, length):
        super().__init__(length, length)


sqr = Square(4)
print("Area of Square is:", sqr.area())

rect = Rectangle(2, 4)
print("Area of Rectangle is:", rect.area())
 

Dalam contoh ini, persegi panjang adalah superclass. Kuadrat adalah subkelas karena Metode persegi dan persegi panjang __init __ () sangat terkait sehingga kami dapat menyebut metode __init __ () superclass (persegi panjang .__ init __ ()) dari persegi dengan menggunakan kata kunci super ().

Ini menetapkan atribut panjang dan lebar meskipun Anda harus menyediakan parameter panjang tunggal ke konstruktor persegi.

Saat Anda menjalankan ini, meskipun kelas persegi Anda tidak secara eksplisit mengimplementasikannya, panggilan ke .Area () akan menggunakan metode area () dalam superclass dan cetak 16.

Kelas persegi mewarisi .Area () dari kelas persegi panjang.

Lihat outputnya.

➜  pyt python3 app.py
Area of Square is: 16
Area of Rectangle is: 8
➜  pyt
 

Itu sama seperti di atas.

Fungsi Python Super () dengan warisan multilevel

Kami telah menyatakan sebelumnya bahwa fungsi Python’s Super () memungkinkan kami untuk merujuk ke superclass secara implisit. Tetapi dalam skenario warisan multilevel, kelas mana yang akan dirujuk? Fungsi super () akan selalu mengacu pada superclass langsung.

Fungsi super () dapat merujuk ke __init () __ Fungsi dan panggil semua fungsi lain dari superclass.

Lihat contoh berikut.

# app.py

class A:
    def __init__(self):
        print('Initializing: class A')

    def sub_method(self, b):
        print('Printing from class A:', b)


class B(A):
    def __init__(self):
        print('Initializing: class B')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class B:', b)
        super().sub_method(b + 1)


class C(B):
    def __init__(self):
        print('Initializing: class C')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class C:', b)
        super().sub_method(b + 1)


if __name__ == '__main__':
    c = C()
    c.sub_method(1) 

Lihat output di bawah ini.

Super()

Jadi, dari output, kita dapat melihat bahwa fungsi __init () __ dari Kelas C telah dipanggil pada awalnya, lalu Kelas B, dan setelah kelas itu A.

Hal yang sama terjadi dengan menelepon sub_method () fungsi.

Jika program Anda berisi warisan multilevel, maka fungsi Super () juga bermanfaat bagi Anda.

Fungsi Python Super () dengan warisan berganda

Dalam beberapa warisan, fungsi super () berguna. Python mendukung warisan berganda, di mana kelas yang diturunkan dapat mewarisi dari beberapa kelas dasar yang tidak harus mewarisi satu sama lain.

Dalam beberapa warisan, fitur semua kelas induk diwarisi ke kelas anak. Dengan demikian, sintaks untuk warisan berganda mirip dengan warisan tunggal.

class Base1:
    pass

class Base2:
    pass

class MultiDerived(Base1, Base2):
    pass 

Di sini, multerived berasal dari kelas Base1 dan Base2. Lihat kode berikut.

class TeamMember(object):
    def __init__(self, name, uid):
        self.name = name
        self.uid = uid

# Parent class 2
class Worker(object):
    def __init__(self, pay, jobtitle):
        self.pay = pay
        self.jobtitle = jobtitle

# Deriving a child class from the two parent classes
class TeamLeader(TeamMember, Worker):
    def __init__(self, name, uid, pay, jobtitle, exp):
        self.exp = exp
        TeamMember.__init__(self, name, uid)
        Worker.__init__(self, pay, jobtitle)
        print("Name: {}, Pay: {}, Exp: {}".format(
            self.name, self.pay, self.exp))


TL = TeamLeader('Michael', 10001, 250000, 'Scrum Master', 5)
 

Keluaran

Name: Michael, Pay: 250000, Exp: 5 

Dalam contoh ini, Anggota tim Kelas memiliki dua properti: nama dan uid . Kelas Pekerja memiliki dua properti: membayar dan judul pekerjaan. Kedua kelas ini adalah kelas dasar.

Kemudian kami telah mendefinisikan kelas turunan yang disebut Pemimpin tim, yang meluas Anggota tim dan Pekerja

Itu berarti kita dapat mengakses semua sifat kelas orang tua pada anak atau kelas turunan.

Di baris terakhir, kami telah membuat objek dan melewati empat properti dalam konstruktor. Dan akhirnya, kami akan mendapatkan output.

Mengesampingkan metode menggunakan super ()

Saat Anda mendefinisikan metode kelas orang tua di kelas anak, proses ini disebut overriding.

Dengan kata lain, kelas anak dapat mengesampingkan metode induknya atau superclass dengan mendefinisikan fungsi dengan nama yang sama.

Namun, ada beberapa aturan untuk mengesampingkan:

  1. Nama metode harus sama dengan parameternya.
  2. Jika metode superclass bersifat pribadi (diawali dengan garis bawah ganda), Anda tidak dapat menimpanya.

Dalam Python, Anda dapat menggunakan metode super () untuk mengesampingkan. Ini memiliki sintaks berikut.

# Override using the super() method
super(class_name, self).override_method_name() 

Lihat kode berikut.

class base(object):
    def base_func(self):
        print('Method of base class')


class child(base):
    def base_func(self):
        print('Method of child class')
        super(child, self).base_func()


class next_child(child):
    def base_func(self):
        print('Method of next_child class')
        super(next_child, self).base_func()


obj = next_child()
obj.base_func()
 

Keluaran

Method of next_child class
Method of child class
Method of base class 

Python Super Init

Fungsi Python Super () memungkinkan Anda menghindari secara eksplisit mengacu pada kelas dasar, yang bisa sangat baik. Tetapi keuntungan utama datang dengan warisan berganda, di mana segala macam hal menyenangkan dapat terjadi.

Sintaks berubah dalam Python 3.0: Anda dapat mengatakan super () .__ init __ () bukan super (childb, self) .__ init __ (), yang menurut saya, sedikit lebih baik.

Kita gunakan Super di Python, Sehingga kelas anak menggunakan warisan berganda akan memanggil fungsi kelas induk berikutnya yang benar dalam urutan resolusi metode (MRO).

Perbedaan utama adalah bahwa Anda mendapatkan lapisan tipuan di __init__ dengan Super, yang menggunakan kelas saat ini untuk menentukan kelas berikutnya __init__ untuk melihat ke atas di MRO.

Jika kami tidak memiliki objek super, kami harus menulis kode manual di mana -mana (atau membuatnya kembali!) Untuk memastikan bahwa kami memanggil metode berikutnya yang tepat dalam urutan resolusi metode!

Bagaimana Super melakukan ini di Python 3 tanpa secara eksplisit memberi tahu kelas dan contoh mana dari metode yang dipanggil?

Ini mendapatkan bingkai tumpukan panggilan.

Ia menemukan kelas (disimpan secara implisit sebagai variabel bebas lokal, __class__, menjadikan fungsi panggilan sebagai penutupan atas kelas) dan argumen pertama untuk fungsi itu, yang seharusnya menjadi instance atau kelas yang menginformasikannya metode resolusi metode (MRO) mana menggunakan.

Metode Resolution Order (MRO)

Metode Resolution Order (MRO) adalah bagaimana metode harus diwarisi dengan adanya warisan berganda. Anda dapat melihat MRO menggunakan atribut __mro__.

Urutan resolusi metode (atau MRO ) Memberitahu Python untuk mencari metode yang diwariskan. Ini berguna saat Anda menggunakan Super () karena MRO berarti Anda tepat di mana Python akan mencari metode yang Anda panggil dengan Super () dan dalam urutan apa.

Setiap kelas memiliki atribut .__ MRO__ untuk memeriksa pesanan.

Kesimpulan

Dalam tutorial ini, Anda belajar cara menggunakan Super () dengan kelas Anda.

Perjalanan Anda dimulai dengan ulasan warisan tunggal dan kemudian menunjukkan cara memanggil metode superclass dengan cepat super()

Anda kemudian belajar bagaimana warisan berganda bekerja dalam Python dan teknik untuk menggabungkan super() dengan banyak warisan.

Lihat sumber daya lain untuk informasi lebih lanjut tentang pemrograman berorientasi objek di Python dan super()

Akhirnya, Contoh Fungsi Super Python sudah berakhir.

Posting yang disarankan

Dekorator Python

Cara parse json di python

Penanganan file dalam python

Kamus Python

Penanganan Pengecualian dalam Python

Artikel ini berasal dari website Winpoin, dan kemudian diterjemahkan ke bahasa indonesia, baca artikel asli disini

Leave a Reply

Your email address will not be published. Required fields are marked *