Python测试开发:抽象类和归一化,很有意思
创始人
2024-01-30 04:10:47
0

抽象类和归一化

引言:

​ 什么是抽象类?什么是归一化?干讲的话比较枯燥,而且不易理解,今天呢给大家准备一个实际的例子带大家进行理解学习,然后进行总结。

示例:

  • 场景1: 新的任务下来了,需要创建两个类,一个人类,一个狗类,他们都会移动和进食,可以实例化出对象供其他人进行调用。甲程序员开发人类部分的代码,乙程序员开发狗类部分的代码。

    • 甲的代码(人类):

      # 定义人类
      class Human:# 移动接口def walk(self):print("Human is walking")# 进食接口def eat(self):print("Human is eating")
      
    • 乙的代码(狗类):

      # 定义狗类
      class Dog:# 移动接口def run(self):print("Dog is running")# 进食接口def eat(self):print("Dog is eating")
      
    • 调用者进行调用:

      if __name__ == '__main__':# 实例化得到一个人和一条狗h1 = Human()d1 = Dog()# 调用移动接口h1.walk()d1.run()
      

      通过结果我们可以看到,同样是调用移动接口,但是要使用两种不同的调用方法,但是对于我们调用者而言,我们并不关心具体实现的细节,我们想要的是同类接口可以去统一的用一种方式去调用

  • 场景2: 需求同场景1,但是我们根据调用者的痛点进行了优化:给甲乙程序员开会让人类和狗类都继承一个父类(动物类),动物类提供两个方法移动和进食,人类和狗类重写父类的这两个方法,好方便让调用者统一调用

    • 示例代码:

      # 定义动物类
      class Animal:# 移动接口def move(self):pass# 进食接口def eat(self):pass# 定义人类
      class Human(Animal):# 移动接口def move(self):print("Human is walking")# 进食接口def eat(self):print("Human is eating")# 定义狗类
      class Dog(Animal):# 移动接口def move(self):print("Dog is running")# 进食接口def eat(self):print("Dog is eating")if __name__ == '__main__':# 实例化得到一个人和一条狗h1 = Human()d1 = Dog()# 调用移动接口h1.move()d1.move()
      

      到这里看似我们完美解决了这个痛点,但是真的解决了吗?咱们继续看故事发展(场景3)

  • 场景3: 故事延续场景2,这时候公司新招聘来了一个程序员丙,他的任务是定义一个猫类,由于他并不知道以前调用者的痛点,所以开发时没有重写父类提供的方法

    • 丙的代码(猫类):

      # 定义猫类
      class Cat(Animal):# 移动接口def run(self):print("Dog is running")# 进食接口def eat(self):print("Dog is eating")
      
    • 调用者调用(猫类):

      if __name__ == '__main__':# 实例化得到一只猫c1 = Cat()# 调用移动接口c1.move()
      

      通过执行结果可以发现,调用者在不知情的情况下按照以往的习惯去调用移动接口,并没有得到想要的接口,因为丙程序员并没有按照规定把移动接口定义成move,而定义成了其他名字,所以,痛点又出现了,虽然定了调用规则,但是这个规则并没有约束性,我不按照规则写,依旧可以进行开发,所以,如何让我们的规则具有约束性呢,这里我们可以用到抽象类来进行约束

抽象类

  • 抽象类: 只能被继承,不能被实例化的类, 抽象类中有抽象方法,且子类必须实现抽象方法。

  • 归一化:在程序设计上,这种使得外部调用者无需关心具体细节,可一视同仁的处理实现特定接口的所有对象的思维,叫做归一化。

    • 如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的。

    • 比如我们有香蕉的类,有苹果的类,有桃子的类,从这些类抽取相同的内容就是水果这个抽象的类,你吃水果时,要么是吃一个具体的香蕉,要么是吃一个具体的桃子。。。。。。你永远无法吃到一个叫做水果的东西。

    • 从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽象而来的。

抽象类的使用步骤:

  1. 导入abc包:import abc
  2. 抽象类需添加指定的参数:class 类名(metaclass = abc.ABCMeta)
  3. 抽象方法需添加装饰器:@abc.abstractmethod
  • 示例代码:
import abc# 创建抽象类
class Animal(metaclass=abc.ABCMeta):# 移动接口@abc.abstractmethoddef move(self):pass# 进食接口@abc.abstractmethoddef eat(self):pass# 定义人类
class Human(Animal):# 移动接口def move(self):print("Human is walking")# 进食接口def eat(self):print("Human is eating")# 定义狗类
class Dog(Animal):# 移动接口def move(self):print("Dog is running")# 进食接口def eat(self):print("Dog is eating")# 定义猫类
class Cat(Animal):# 移动接口def run(self):print("Dog is running")# 进食接口def eat(self):print("Dog is eating")

调试:

if __name__ == '__main__':# 实例化得到一个人和一条狗h1 = Human()d1 = Dog()c1 = Cat()  # TypeError: Can't instantiate abstract class Cat with abstract method move# 调用移动接口h1.move()d1.move()c1.move()

通过执行结果我们可以看出,如果我们的类继承了这个抽象类,如果没有重写抽象类内的抽象方法的话,代码会报错:TypeError: Can't instantiate abstract class Cat with abstract method move,这样我们就可以解决上述示例代码里我们无法约束子类的痛点了

抽象类不可以被实例化

  • 实例代码:

    import abc# 创建抽象类
    class Animal(metaclass=abc.ABCMeta):# 移动接口@abc.abstractmethoddef move(self):pass# 进食接口@abc.abstractmethoddef eat(self):passif __name__ == '__main__':h1 = Animal()  # TypeError: Can't instantiate abstract class Animal with abstract methods eat, move
    

    通过结果我们可以看出,抽象类不可以被实例化,否则报错:TypeError: Can't instantiate abstract class Animal with abstract methods eat, move

总结:

  • 抽象类使用步骤:
    • 导入abc包:import abc
    • 抽象类需添加指定的参数:class 类名(metaclass = abc.ABCMeta)
    • 抽象方法需添加装饰器:@abc.abstractmethod
  • 抽象类的优点:
    • 调用者可以无需关心具体实现细节,可以一视同仁处理实现特定接口的所有对象。

如果感觉有所收获的话,帮忙关注公众号:橙好测试开发,点个关注不迷路,下期更精彩!

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...