Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk menyelesaikan ralat bahawa kod Python tidak mematuhi prinsip tertutup terbuka?
Prinsip Terbuka-Tertutup (OCP) ialah salah satu prinsip penting dalam kejuruteraan perisian Ia menyatakan bahawa entiti perisian (kelas, modul, fungsi, dll.) harus terbuka kepada sambungan dan tertutup kepada pengubahsuaian. Ini bermakna apabila kita perlu menambah fungsi baharu, kita harus cuba mengelak daripada mengubah suai kod sedia ada. Prinsip ini boleh membantu kami menulis kod yang lebih boleh diselenggara dan diperluaskan.
Namun, dalam proses pengaturcaraan sebenar, kami sering menghadapi masalah di mana kod tidak mematuhi prinsip terbuka dan tertutup. Terutama dalam bahasa dinamik seperti Python, lebih mudah untuk menghadapi masalah ini. Jadi bagaimana untuk menyelesaikan ralat yang kod Python tidak mematuhi prinsip tertutup terbuka?
Dalam Python, walaupun tiada antara muka dan kelas abstrak seperti Java, anda boleh menggunakan modul abc untuk mencapai fungsi yang serupa. Kita boleh menentukan kelas asas abstrak, dan kemudian biarkan subkelas mewarisi kelas asas abstrak ini dan melaksanakan kaedah yang ditakrifkan dalam kelas asas abstrak, untuk mencapai tujuan kod yang mematuhi prinsip terbuka dan tertutup.
Berikut ialah contoh kod:
import abc class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod def make_sound(self): pass class Dog(Animal): def make_sound(self): print("汪汪汪!") class Cat(Animal): def make_sound(self): print("喵喵喵!") def make_animal_sound(animal): animal.make_sound() if __name__ == '__main__': dog = Dog() cat = Cat() make_animal_sound(dog) make_animal_sound(cat)
Dalam kod sampel ini, kelas Haiwan ialah kelas asas abstrak, yang mentakrifkan kaedah abstrak make_sound. Kaedah ini tidak dilaksanakan kerana dalam kelas asas abstrak, kaedah abstrak hanyalah pengisytiharan, dan pelaksanaannya harus diselesaikan oleh subkelas.
Kami menentukan dua subkelas, Anjing dan Kucing, yang mewarisi kelas Haiwan dan melaksanakan kaedah make_sound. Kemudian kami mentakrifkan fungsi make_animal_sound, yang menerima parameter jenis Haiwan dan memanggil kaedah make_sound parameter ini.
Melalui kelas asas abstrak dan warisan, kami melaksanakan prinsip terbuka dan tertutup. Jika kita perlu menambah haiwan baharu, seperti serigala, kita hanya perlu mentakrifkan kelas Serigala, mewarisi kelas Haiwan dan melaksanakan kaedah make_sound, tanpa mengubah suai kod sedia ada.
Penghias dalam Python ialah alat yang sangat berkuasa yang boleh menambah kefungsian tambahan secara dinamik pada fungsi atau kelas tanpa mengubah suai kod sedia ada. Kita boleh menggunakan penghias untuk meningkatkan kefungsian kelas atau fungsi untuk mencapai kod yang mematuhi prinsip terbuka dan tertutup.
Berikut ialah contoh kod:
def send_email(func): def wrapper(*args, **kwargs): result = func(*args, **kwargs) print("发送邮件成功!") return result return wrapper class Order: def __init__(self, order_id, amount): self.order_id = order_id self.amount = amount @send_email def pay(self): print("订单{}已支付{}元。".format(self.order_id, self.amount)) if __name__ == '__main__': order = Order("20210601001", 199.0) order.pay()
Dalam kod sampel ini, kami mentakrifkan penghias send_email. Ia menerima fungsi sebagai parameter dan mengembalikan pembungkus fungsi penutupan. Fungsi pembungkus ini menghantar e-mel sebelum memanggil fungsi asal, dan kemudian mengembalikan hasil fungsi asal.
Kami mentakrifkan kelas Pesanan, yang mempunyai kaedah pembayaran. Kami menambahkan penghias send_email pada kaedah bayar, supaya apabila kami memanggil kaedah bayar, e-mel akan dihantar dahulu, dan kemudian logik fungsi asal akan dilaksanakan.
Melalui penghias, kami melaksanakan prinsip buka-tutup. Jika kami perlu menambah kaedah baharu pada kelas Pesanan, seperti kaedah bayaran balik, kami hanya perlu mentakrifkan kaedah bayaran balik dan tidak perlu mengubah suai kod sedia ada.
Polymorfisme ialah konsep penting dalam pengaturcaraan berorientasikan objek Ini bermakna antara muka yang sama boleh mempunyai pelaksanaan yang berbeza. Dalam Python, polimorfisme boleh dicapai dengan mengatasi kaedah kelas induk, menggunakan menaip itik, dsb.
Berikut ialah kod contoh:
class Shape: def draw(self): pass class Circle(Shape): def draw(self): print("画一个圆形。") class Rectangle(Shape): def draw(self): print("画一个矩形。") def draw_shape(shape): shape.draw() if __name__ == '__main__': circle = Circle() rectangle = Rectangle() draw_shape(circle) draw_shape(rectangle)
Dalam kod sampel ini, kami mentakrifkan Bentuk kelas asas abstrak, yang mempunyai cabutan kaedah abstrak. Kemudian kami menentukan dua subkelas, Circle dan Rectangle, yang masing-masing mewarisi Bentuk dan melaksanakan kaedah cabutan. Kami mentakrifkan fungsi draw_shape, yang menerima parameter jenis Shape dan memanggil kaedah cabutannya.
Melalui polimorfisme, kita boleh mengendalikan pelbagai jenis objek secara fleksibel, dengan itu merealisasikan prinsip terbuka dan tertutup. Jika kita perlu menambah bentuk baharu, seperti segi tiga, kita hanya perlu mentakrifkan kelas Segitiga, mewarisi kelas Bentuk dan melaksanakan kaedah cabutan, tanpa mengubah suai kod sedia ada.
Ringkasan
Dalam Python, menulis kod yang mematuhi prinsip terbuka dan tertutup boleh dicapai dengan menggunakan antara muka dan kelas abstrak, menggunakan penghias, menggunakan polimorfisme, dsb. Kaedah ini boleh menambah fungsi baharu tanpa mengubah suai kod sedia ada, menjadikan kod lebih boleh diselenggara dan diperluaskan. Pada masa yang sama, kita juga harus mengikut prinsip terbuka dan tertutup sebanyak mungkin dalam proses pengaturcaraan sebenar untuk meningkatkan kualiti dan kebolehselenggaraan kod.
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan ralat bahawa kod Python tidak mematuhi prinsip tertutup terbuka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!