Warisan adalah konsep asas dalam pengaturcaraan berorientasikan objek, termasuk Python. Ia membolehkan kelas (dipanggil kanak -kanak atau kelas yang diperoleh) untuk mewarisi atribut dan kaedah dari kelas lain (dikenali sebagai ibu bapa atau kelas asas). Ini menggalakkan penggunaan semula kod dan mewujudkan hubungan hierarki di kalangan kelas.
Di Python, warisan dilaksanakan menggunakan class ChildClass(ParentClass):
. Inilah contoh:
<code class="python">class Animal: def __init__(self, name): self.name = name def speak(self): pass class Dog(Animal): def speak(self): return f"{self.name} says Woof!" my_dog = Dog("Buddy") print(my_dog.speak()) # Output: Buddy says Woof!</code>
Dalam contoh ini, Dog
adalah kelas kanak -kanak yang mewarisi dari Animal
. Kelas Dog
mengatasi kaedah speak
untuk menyediakan pelaksanaannya sendiri.
Python juga menyokong pelbagai warisan, di mana kelas boleh mewarisi dari pelbagai kelas induk. Ini dicapai dengan menyenaraikan kelas induk di dalam kurungan definisi kelas, dipisahkan oleh koma. Inilah cara ia berfungsi:
<code class="python">class Mammal: def __init__(self, mammal_name): self.mammal_name = mammal_name class Carnivore: def __init__(self, diet): self.diet = diet class Dog(Mammal, Carnivore): def __init__(self, name, diet): Mammal.__init__(self, name) Carnivore.__init__(self, diet) my_dog = Dog("Buddy", "meat") print(my_dog.mammal_name) # Output: Buddy print(my_dog.diet) # Output: meat</code>
Dalam contoh ini, Dog
mewarisi dari kedua -dua Mammal
dan Carnivore
. Kaedah __init__
Dog
memanggil pembina kedua -dua kelas induk untuk memulakan atribut dari kedua -duanya.
Warisan menawarkan beberapa manfaat penting dalam pengaturcaraan Python:
Masalah berlian adalah isu biasa dalam pelbagai warisan di mana kekaburan timbul apabila subclass mewarisi dari dua kelas yang mempunyai nenek moyang yang sama. Di Python, masalah ini dikurangkan dengan menggunakan algoritma linearization C3, yang juga dikenali sebagai Perintah Resolusi Kaedah (MRO), yang mentakrifkan perintah yang konsisten untuk menyelesaikan kaedah dan sifat.
Secara jelas mengelakkan masalah berlian dan memastikan tingkah laku yang diingini:
super()
: Daripada terus memanggil kaedah kelas induk, gunakan super()
untuk memastikan bahawa resolusi kaedah mengikuti MRO. Ini membantu mengelakkan kekaburan dalam memanggil kaedah dan mengurangkan kemungkinan masalah berlian.mro()
atau atribut __mro__
untuk memeriksa urutan di mana kaedah akan dipanggil. Berikut adalah contoh yang menunjukkan masalah berlian dan bagaimana super()
dapat membantu:
<code class="python">class A: def __init__(self): print("A") class B(A): def __init__(self): print("B") super().__init__() class C(A): def __init__(self): print("C") super().__init__() class D(B, C): def __init__(self): print("D") super().__init__() d = D() print(D.mro())</code>
Output akan:
<code>D B C A [<class>, <class>, <class>, <class>, <class>]</class></class></class></class></class></code>
MRO memastikan bahawa setiap kaedah __init__
dipanggil tepat sekali, mengelakkan masalah berlian.
Dalam konteks warisan python, kaedah yang mengatasi dan kaedah beban adalah konsep yang digunakan untuk mencapai polimorfisme, tetapi mereka beroperasi secara berbeza:
Kaedah Mengatasi : Kaedah yang mengatasi berlaku apabila kelas kanak -kanak menyediakan pelaksanaan khusus untuk kaedah yang telah ditakrifkan dalam kelas induknya. Ini membolehkan kelas kanak -kanak menyesuaikan atau memperluaskan tingkah laku kaedah yang diwarisi.
Contoh:
<code class="python">class Animal: def speak(self): return "Some sound" class Dog(Animal): def speak(self): return "Woof!" dog = Dog() print(dog.speak()) # Output: Woof!</code>
Dalam contoh ini, Dog
mengatasi kaedah speak
Animal
, menyediakan pelaksanaannya sendiri.
Kaedah overloading : Kaedah overloading biasanya merujuk kepada keupayaan untuk menentukan pelbagai kaedah dengan nama yang sama tetapi parameter yang berbeza. Walau bagaimanapun, Python tidak menyokong kaedah yang berlebihan dalam pengertian tradisional. Sebaliknya, Python menggunakan teknik yang dipanggil nilai argumen lalai untuk mensimulasikan kaedah overloading.
Contoh:
<code class="python">class Calculator: def add(self, a, b=0, c=0): return abc calc = Calculator() print(calc.add(1)) # Output: 1 print(calc.add(1, 2)) # Output: 3 print(calc.add(1, 2, 3)) # Output: 6</code>
Dalam contoh ini, kaedah add
bertindak secara berbeza berdasarkan bilangan argumen yang disediakan, meniru kaedah yang berlebihan.
Ringkasnya, kaedah yang mengatasi adalah mengenai mentakrifkan semula kaedah dalam kelas kanak -kanak, sementara kaedah yang berlebihan dalam Python dicapai melalui argumen lalai, yang membolehkan satu kaedah untuk mengendalikan set parameter yang berlainan.
Atas ialah kandungan terperinci Apakah warisan dalam python? Bagaimana anda melaksanakan pelbagai warisan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!