Bagaimana untuk menyelesaikan ralat bahawa kod Python tidak mematuhi prinsip tertutup terbuka?

WBOY
Lepaskan: 2023-06-24 18:27:16
asal
921 orang telah melayarinya

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?

  1. Gunakan antara muka dan kelas abstrak

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)
Salin selepas log masuk

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.

  1. Menggunakan Penghias

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()
Salin selepas log masuk

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.

  1. Gunakan polimorfisme

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan