Python面向对象的五大设计原则---SOLID原则

作者:大家好,我是阿旭
支持我:点赞收藏⭐️留言
系列专栏:23种设计模式详解-Python 

首字母 指代 概念
S 单一职责原则 对象只有一种单一功能
O 开闭原则 对扩展开放,对修改禁止
L 里氏替换原则 对象应该是可以在不改变程序正确性的前提下被它的子类所替换
I 接口隔离原则 多个特定客户端接口要好于一个宽泛用途的接口
D 依赖倒置原则 一个方法应该遵从依赖于抽象而不是一个实例

1.Single:单一功能原则

不要存在导致类变更的原因,通俗的说是:一个类只负责一项职责。

class User:
    pass


class Pay:
    pass

可以看到我在这里定义了两个类分别为用户类和支付类,当有需求改变时,你只能是用户需求改变用户类,支付需求改变支付类,确保一个类只负责一项职责。

2.Open:开闭原则

一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。通俗的说是:软件实体应在不修改原有代码的基础上进行扩展。(尽量不改,具体情况随机应变。)

3.Liskov:里氏替换原则

所有引用父类的地方必须能透明的使用其子类的对象。通俗的说是:有一段代码在使用父类对象没问题的情况下,使用字类对象也是肯定没问题的。

class User:
    pass

class VIPUser(User):
    pass

def show_user(u):
    return u.name

这里我们创建了User类,并创建了User类的字类VIPUser,当我们在使用show_user方法时,一定保证传入两种类型的user都能成功。

4.Interface:接口隔离原则

使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些他不需要的接口。

from abc import ABCMeta, abstractmethod

class Animal(metacalss=ABCMeta):
    @abstractmethod
    def walk(self):
        pass
   
    @abstractmethod
    def swim(self):
        pass
    
    @abstractmethod
    def fly(self):
        pass
    

 我们在这里定义了一个动物移动方式的抽象接口类,当我们在定义单个动物类继承它的时候,你会发现walk、swim、fly都需要在子类中重新定义,但是有的动物并不是可以走、游、飞,这样程序就会出现错误,所以我们应该改为:

from abc import ABCMeta, abstractmethod

class WalkAnimal(metacalss=ABCMeta):
    @abstractmethod
    def walk(self):
        pass
   
class SwimAnimal(metacalss=ABCMeta):
    @abstractmethod
    def swim(self):
        pass
    
class FlyAnimal(metacalss=ABCMeta):
    @abstractmethod
    def fly(self):
        pass
    

这样的就可以遵循我们的接口隔离原则,不同的字类可以继承一个或者多个父类。

5.Dependency:依赖倒置原则

高层模块不应该依赖底层模块,二者都应该依赖其抽象,抽象不应该依赖细节,细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程。

from abc import ABCMeta, abstractmethod

# 接口
class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self, money):
        pass


# 底层代码1
class AliPay(Payment):
    def pay(self, money):
        print("支付宝支付%d元" % money)


# 底层代码2
class WechatPay(Payment):
    def pay(self, money):
        print("微信支付%d元" % money)
  • 当我们的接口定义好时,底层代码和高层代码可同时进行。底层代码仿照接口类中方法进行定义,高层代码依照接口类中的方法进行调用,所以说二者都应该依赖其抽象接口。
  • 底层代码为细节,它们需要依赖抽象接口。

订阅专栏,每天学习不同的Python设计模式✌️

你可能感兴趣的:(设计模式-Python,python,设计模式)