sjms-1 面向对象

面向对象设计

先设计架构,然后去完成相应模块和类

设计模式:对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。每一个设计模式系统地命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。
“四人帮”(Gang of Four, GoF):
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
  《设计模式:可复用面向对象软件的基础》

面向对象的三大特性:
封装(数据属性)
继承(复用)
多态(python本是多态的语言,不用纠结)

这是一个递进关系

接口

接口:若干抽象方法的集合。
作用:限制实现接口的类必须按照接口给定的调用方式实现这些方法;对高层模块隐藏了类的内部实现。

25562437

不去调用pay 不会报错

继承抽象类时,

只有当完成抽象类的,抽象方法,才能被调用

25773734

实现了payment 接口

接口:若干抽象方法的集合。

作用:限制实现接口的类必须按照接口给定的调用方式实现这些方法;对高层模块隐藏了类的内部实现。

不用去看内部逻辑,直接调用接口

写底层模块时,大量使用设计模式

面向对象设计SOLID原则

开放封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
里氏替换原则:所有引用父类的地方必须能透明地使用其子类的对象。

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

不同的支付方式不应该依赖底层的Payment,只是依赖底层的抽象方法去实现不同支付的具体细节。

from abc import ABCMeta, abstractmethod

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

class Alipay(Payment):
    def pay(self, money):
        print("支付宝支付%d元." % money)

class WechatPay(Payment):
    def pay(self, money):
        print("微信支付%d元." % money)

p = WechatPay()
p.pay(100)

  

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

一个类写多个接口,会导致继承的类没有实现不必要的接口而报错

class LandAnimal(metaclass=ABCMeta):
    @abstractmethod
    def walk(self):
        pass

class WaterAnimal(metaclass=ABCMeta):
    @abstractmethod
    def swim(self):
        pass

class SkyAnimal(metaclass=ABCMeta):
    @abstractmethod
    def fly(self):
        pass

class Tiger(LandAnimal):
    def walk(self):
        print("老虎走路")

class Frog(LandAnimal, WaterAnimal):
    pass

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

原文地址:https://www.cnblogs.com/wenyule/p/10532781.html