Warisan membolehkan kita menentukan kelas yang mengambil semua fungsi dari kelas induk dan membolehkan kita menambah lebih banyak. Dalam tutorial ini, anda akan belajar menggunakan warisan di Python.
Video: Python Warisan
Warisan di Python
Warisan adalah ciri yang kuat dalam pengaturcaraan berorientasikan objek.
Ini merujuk kepada mendefinisikan kelas baru dengan sedikit atau tanpa modifikasi ke kelas yang ada. Kelas baru dipanggil kelas turunan (atau anak) dan kelas yang diwarisi dipanggil kelas asas (atau ibu bapa) .
Sintaks Python Inheritance
kelas BaseClass: Badan kelas kelas asas DerivedClass (BaseClass): Badan kelas turunan
Kelas turunan mewarisi ciri dari kelas asas di mana ciri baru dapat ditambahkan kepadanya. Ini menghasilkan penggunaan semula kod.
Contoh Warisan di Python
Untuk menunjukkan penggunaan warisan, mari kita ambil contoh.
Poligon adalah angka tertutup dengan 3 sisi atau lebih. Katakanlah, kita mempunyai kelas yang disebut Polygon
sebagai berikut.
class Polygon: def __init__(self, no_of_sides): self.n = no_of_sides self.sides = (0 for i in range(no_of_sides)) def inputSides(self): self.sides = (float(input("Enter side "+str(i+1)+" : ")) for i in range(self.n)) def dispSides(self): for i in range(self.n): print("Side",i+1,"is",self.sides(i))
Kelas ini mempunyai atribut data untuk menyimpan bilangan sisi n dan besarnya setiap sisi sebagai senarai yang disebut sisi.
The inputSides()
Cara mengambil masa dalam magnitud setiap sisi dan dispSides()
memaparkan ini panjang sampingan.
Segi tiga adalah poligon dengan 3 sisi. Oleh itu, kita boleh membuat kelas yang disebut Triangle yang mewarisi dari Polygon. Ini menjadikan semua atribut kelas Polygon tersedia untuk kelas Segitiga.
Kami tidak perlu mendefinisikannya lagi (penggunaan semula kod) Segitiga boleh didefinisikan sebagai berikut.
class Triangle(Polygon): def __init__(self): Polygon.__init__(self,3) def findArea(self): a, b, c = self.sides # calculate the semi-perimeter s = (a + b + c) / 2 area = (s*(s-a)*(s-b)*(s-c)) ** 0.5 print('The area of the triangle is %0.2f' %area)
Walau bagaimanapun, kelas Triangle
mempunyai kaedah baru findArea()
untuk mencari dan mencetak luas segitiga. Berikut adalah contoh larian.
>>> t = Triangle() >>> t.inputSides() Enter side 1 : 3 Enter side 2 : 5 Enter side 3 : 4 >>> t.dispSides() Side 1 is 3.0 Side 2 is 5.0 Side 3 is 4.0 >>> t.findArea() The area of the triangle is 6.00
Kita dapat melihat bahawa walaupun kita tidak menentukan kaedah seperti inputSides()
atau dispSides()
untuk kelas Triangle
secara berasingan, kita dapat menggunakannya.
Sekiranya atribut tidak dijumpai di kelas itu sendiri, carian diteruskan ke kelas asas. Ini berulang secara berulang, jika kelas asas itu sendiri berasal dari kelas lain.
Kaedah Mengatasi di Python
Dalam contoh di atas, perhatikan __init__()
kaedah yang ditentukan di kedua kelas, Segitiga dan juga Poligon. Apabila ini berlaku, kaedah dalam kelas yang diturunkan akan mengatasi kaedah di kelas asas. Ini bermaksud, __init__()
di Segitiga mendapat keutamaan daripada __init__
di Poligon.
Secara amnya apabila mengatasi kaedah asas, kita cenderung memperluas definisi daripada hanya menggantinya. Perkara yang sama dilakukan dengan memanggil kaedah di kelas asas dari yang di kelas turunan (memanggil Polygon.__init__()
dari __init__()
dalam Triangle
).
Pilihan yang lebih baik adalah menggunakan fungsi terbina dalam super()
. Jadi, super().__init__(3)
setara dengan Polygon.__init__(self,3)
dan disukai. Untuk mengetahui lebih lanjut mengenai super()
fungsi di Python, lawati fungsi Python super ().
Dua fungsi terbina dalam isinstance()
dan issubclass()
digunakan untuk memeriksa warisan.
Fungsi isinstance()
kembali True
jika objek itu adalah contoh kelas atau kelas lain yang berasal darinya. Setiap kelas di Python mewarisi dari kelas asas object
.
>>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True
Begitu juga, issubclass()
digunakan untuk memeriksa warisan kelas.
>>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True