[{"createTime":1735734952000,"id":1,"img":"hwy_ms_500_252.jpeg","link":"https://activity.huaweicloud.com/cps.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905","name":"华为云秒杀","status":9,"txt":"华为云38元秒杀","type":1,"updateTime":1735747411000,"userId":3},{"createTime":1736173885000,"id":2,"img":"txy_480_300.png","link":"https://cloud.tencent.com/act/cps/redirect?redirect=1077&cps_key=edb15096bfff75effaaa8c8bb66138bd&from=console","name":"腾讯云秒杀","status":9,"txt":"腾讯云限量秒杀","type":1,"updateTime":1736173885000,"userId":3},{"createTime":1736177492000,"id":3,"img":"aly_251_140.png","link":"https://www.aliyun.com/minisite/goods?userCode=pwp8kmv3","memo":"","name":"阿里云","status":9,"txt":"阿里云2折起","type":1,"updateTime":1736177492000,"userId":3},{"createTime":1735660800000,"id":4,"img":"vultr_560_300.png","link":"https://www.vultr.com/?ref=9603742-8H","name":"Vultr","status":9,"txt":"Vultr送$100","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":5,"img":"jdy_663_320.jpg","link":"https://3.cn/2ay1-e5t","name":"京东云","status":9,"txt":"京东云特惠专区","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":6,"img":"new_ads.png","link":"https://www.iodraw.com/ads","name":"发布广告","status":9,"txt":"发布广告","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":7,"img":"yun_910_50.png","link":"https://activity.huaweicloud.com/discount_area_v5/index.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=aXhpYW95YW5nOA===&utm_medium=cps&utm_campaign=201905","name":"底部","status":9,"txt":"高性能云服务器2折起","type":2,"updateTime":1735660800000,"userId":3}]
里氏替换原则(Liskov Substitution Principle,LSP)是面向对象设计的一个重要原则,由 Barbara Liskov 在
1987 年提出。它是针对继承的设计原则,它的核心思想是:继承应该确保父类对象能够在不知道子类对象的情况下,能够正常地运行。
换句话说,LSP 原则要求在任何使用基类对象的地方,都可以使用它的子类对象,而不破坏程序的正确性和可靠性。
LSP 原则的具体表述如下:
*
子类必须完全实现基类的抽象方法。
*
子类可以有自己的个性化实现,但是不能影响父类的行为。
*
子类不能抛出比基类更多或者更宽泛的异常。
*
父类存在的地方,子类也可以存在,反之则不行。
简单来说,LSP 原则要求子类不要破坏父类的行为,而是在保持原有行为的基础上,通过扩展、增加等方式实现特定的个性化需求。
下面通过一个示例来更加详细地解释LSP 原则。
假设有一个基类Person,它有一个方法eat()用于吃饭,然后它有两个子类Student和Teacher,分别增加了study()和teach()
方法。代码如下:
class Person: def eat(self): print("Person eat") class Student(Person): def
study(self): print("Student study") class Teacher(Person): def teach(self):
print("Teacher teach")
现在我们可以用下面的代码来进行测试:
def test_eat(person: Person): person.eat() def test_study(student: Student):
student.study() def test_teach(teacher: Teacher): teacher.teach() if __name__
== '__main__': person = Person() student = Student() teacher = Teacher()
test_eat(person) test_eat(student) test_study(student) # test_study(teacher) #
TypeError: test_study() argument 1 must be Student, not Teacher #
test_teach(student) # TypeError: test_teach() argument 1 must be Teacher, not
Student test_teach(teacher)
这里我们定义了三个测试函数,用于测试吃饭、学习、和教学功能。同时传入不同的对象进行测试,包括父类对象、子类对象和不同子类对象。
在执行结果中,我们可以发现没有任何异常产生,说明代码遵循了LSP原则。
但是如果我们把子类Teacher的teach()方法注释掉,然后执行test_teach(student)
函数,就会有异常抛出。这时候子类Teacher不能替换父类Person,在应用中就违反了LSP原则。
总之,LSP原则是面向对象设计中最基本的原则之一,它保证了代码的可靠性、可维护性和可拓展性,是设计高质量面向对象程序的关键。