IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python:面向对象编程的设计原则之接口隔离原则 -> 正文阅读

[Python知识库]python:面向对象编程的设计原则之接口隔离原则

一,所谓的接口

接口,在不同的上下文环境中拥有不同的含义。
它可以是 web 开发中用于前后端交互的通路,也可以是具体语言如 Java 中通过 interface 来声明的抽象方法的集合,也可以是某个具体的函数。

在面向对象编程的语义中,接口就指属性与方法,它们被封装到类中,作为对象应该具备的属性与行为。

在OOP中,所有的设计原则都是关注如何高效地设计接口并如何将它们应用于对象之间的交互的方法理论的总结

二,继承

继承是扩展代码功能、提高代码可重用性的高效方式。

(一)类的继承

从设计者的角度来看,类是封装逻辑和数据的另一种方式,继承是一种定义类之间逻辑和数据关系的方式:类定义了一组属性与方法,可由更具体的集合(子类)进行继承和定制。

继承产生了一个名为 “is-a” 的链接关系。举个例子:员工是人类,人类是哺乳动物,哺乳动物是动物。

class Animals:
    pass

class Mammals(Animals):
    pass

class Human(Mammals):
    pass

class Employee(Human):
    pass

python还支持多继承:

class Tool:
    pass

class Weapon(Tool):
    pass

class Tableware(Tool):
    pass

class Knife(Tableware, Weapon):
	"小刀既可以是餐具,又可以是武器"
    pass

正式这种多继承机制,让 python 的类设计上更具统一性与扩展性。比如与 Java 类的单继承相比,python 类的多继承能力能统一了 Java 中 interfaceclass,进而能够通过使用 Mixin 类来实现真正意义功能上的扩展。

(二)命名空间与作用域

类对属性与方法的封装、模块对代码块的收集、包对模块的收集、库对包的收集,都会创造各自的命名空间。

命名空间就是对名称的封装。命名空间的存在就是为了尽量避免名称冲突。

命名空间隐含了名称之间的包含关系,这种关系通过 . 体现。比如:

# 从 pandas 库的 core 包的 series 模块导入 Series 类
from pandas.core.series import Series
obj = Series([4, 7, -5, 3])
print(obj)

# 调用 time 模块中的 time 函数
import time
print(time.time())

# 访问 Foo 类中的 foo 属性
class Foo:
    foo = "foo"
foo = Foo()
print(foo.foo)

Python创建、改变或查找名称都是在所谓的命名空间中进行的。在源代码中名称被定义的位置决定了这个名称能被访问到的范围,即所谓的作用域。

(三)解析顺序

具像上面显示的那样,当我们对 class 语句产生的对象使用由 . 连接的对象名与属性名,即object.attribute时, 这个表达式会在 Python 中启动一次对 object 对象相关的类树的搜索动作,来寻找 attribute 首次出现的类。而这个搜索动作,就是继承概念的本质。

显然,这个搜索顺序是相当重要的:

  • 先搜索 object 的命名空间,然后是 object 之上的所有类的命名空间。
  • 如果使用多继承, 父类列在 class 语句首行内的顺序就很重要:Python总是会根据父类在首行的顺序, 由左至右搜索父类中的属性与方法。

三,接口隔离原则

(一)一个接口设计的例子

class Mammals:
    def swim(self):
        print("Can Swim")

    def walk(self):
        print("Can Walk")

    def paint(self):
        print("Can Paint")


class Human(Mammals):
    def swim(self):
        print("Humans can swim")

    def walk(self):
        print("Humans can walk")

    def paint(self):
        print("Humans can paint")

    def sing(self):
        print("Humans can sing")


class Whale(Mammals):
    def swim(self):
        print("Whales can swim")

有一个 Mammals 父类,其中有两个方法。有两个子类,其中分别由三个方法(前两个重写,一个自定义)和一个方法(重写)。

对于继承 Mammals 的 Human 类来说,父类的提供的接口还不够,因此进行了扩展。

但对于继承 Mammals 类的 Whale 类来说,父类提供了过多的接口,这对于不需要 walk 的它来说,walk 成了增加负担、造成错误的一个原因。

(二)接口隔离原则

接口隔离原则(Interface Segregation Principle,ISP)要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含调用者感兴趣的方法。

从这个意义上说,ISP 告诉我们,一个类应该只具有所需的接口,并避免那些不起作用或没有理由成为该类的一部分的方法,从而保持子类的内容精炼整洁。

可以使用抽象基类实现接口中的方法,也可以使用普通类。

修改后的代码:

class InstinctiveBehaviors:
    def swim(self):
        print("Can Swim")

    def walk(self):
        print("Can Walk")


class NonInstinctiveBehaviors:
    def paint(self):
        print("Can Paint")


class Human(InstinctiveBehaviors, NonInstinctiveBehaviors):
    def swim(self):
        print("Humans can swim")

    def walk(self):
        print("Humans can walk")

    def paint(self):
        print("Humans can paint")

    def sing(self):
        print("Humans can sing")


class Whale(InstinctiveBehaviors):
    def swim(self):
        print("Whales can swim")

接口隔离原则
接口隔离原则
设计原则–单一职责与接口隔离原则总结

四,接口隔离原则与单一职责原则

ISP 要求为子类提供最小接口的思想与 SRP 紧密相关,前者可作为后者的依据之一。

但最需要明确的是,两者的出发点不同:

  • ISP 是站在调用者的角度考虑的。
  • SRP 是设计者的优化代码后的结果。

what is the distinction between SRP and ISP?
By applying the ISP are we bound to segregating the class too?

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:27:16  更:2022-03-10 22:28:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 20:55:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计