里氏替换原则:函数传父类对象(User)也必定可以穿子类对象(Vip)【vip继承与User】
class User:
def show_name(self):
pass
class VIPUser(User):
def show_name(self):
pass
u = User()
def show_user(u):
res = u.show_name()
高层模块不应该依赖底层模块,【说半天就一句话,依赖接口编程!!】
https://blog.csdn.net/zhengzhb/article/details/7289269?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163809045916780264060299%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163809045916780264060299&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~hot_rank-2-7289269.first_rank_v2_pc_rank_v29&utm_term=%E4%BE%9D%E8%B5%96%E5%80%92%E7%BD%AE%E5%8E%9F%E5%88%99&spm=1018.2226.3001.4187
老虎类继承了动物类,然而却被迫实现他不该有的行文。因此就有了接口隔离原则。
#一个类如果有抽象方法,就属于抽象类
from abc import ABCMeta, abstractmethod
class Animal(metaclass = ABCMeta):
@abstractmethod
def walk(self):
pass
@abstractmethod
def swim(self):
pass
@abstractmethod
def fly(self):
pass
class Tiger(Animal):
def walk(self):
print("老虎走路")
#被迫实现自己没有的功能???
t = Tiger()
TypeError: Can’t instantiate abstract class Tiger with abstract methods fly, swim
遵循接口隔离原则:使用多个专门接口
青蛙多继承,陆地,水上。
天鹅多继承,陆地,水上,天空。
# -*- encoding: utf-8 -*-
"""
@File : interface.py
@Time : 2021-10-20 10:20
@Author : XD
@Email : gudianpai@qq.com
@Software: PyCharm
"""
#一个类如果有抽象方法,就属于抽象类
from abc import ABCMeta, abstractmethod
class LandAnimal(metaclass = ABCMeta):
@abstractmethod
def walk(self):
pass
class SkyAnimal(metaclass = ABCMeta):
@abstractmethod
def fly(self):
pass
class WaterAnimal(metaclass = ABCMeta):
@abstractmethod
def swim(self):
pass
class Tiger(LandAnimal):
def walk(self):
print("老虎走路")
class Frog(LandAnimal, WaterAnimal):
def walk(self):
pass
def swim(self):
pass
f = Frog()
这三种模式都是为了把一句话变成很多代码
创建型模式:作用于对象的创建,将对象的创建与使用分离
结构性模式:将类或对象按某种布局组成更大的结构
行为型模式:作用于类或对象之间相互协作共同完成单个对象无法单独完成的任务