首页 > 编程语言 >Python抽象类

Python抽象类

时间:2023-05-31 11:22:04浏览次数:38  
标签:name Python 子类 self sing 抽象类 def

Python抽象类

python没有接口类型,因为python是动态类型的语言,像接口这种轻耦合的东西在python中随处都是,例如内置的魔法方法等,甚至可以说在python这种天马行空的语言中接口显的反而有点清秀。

不过Python还是提供了像java中那样的抽象类定义方法,某些时候还是有用的,顾名思义抽象类就是对一些实体类的抽象定义,其出现的主要目的就是为了描述某一类拥有相同方法的类。

抽象类是介于普通的类继承和接口之间的一种中庸之道,他与接口之间的差别不大,甚至可以说能用抽象类处理的实际上都可以用接口处理。

用更加通俗的语言来描述抽象类:

  1. 抽象类当中的抽象方法可以没有具体实现,只需要定义函数名和输入输出即可(python中输入输入亦可省)
  2. 抽象类不能被直接实例化,只有实现了其抽象方法的子类才能实例化
  3. 抽象类的子类必须实现抽象方法

为什么需要抽象类?
1.我们想要为多个实体类定义一个父类,但是我们不想让父类直接实例化,因为父类的实例化没有意义。举个例子,我们定义一个动物类,他有一个sing()方法,但是每种动物的叫声都不一样,直接实例化Animal没有任何意义,我们只是想让他抽象出sing方法来:

class Animal(object):
    def __init__(self, name):
        self.name = name

    def sing(self):
        pass

    def say_name(self):
        print(self.name)

这样的普通Animal类可以实例化,但是之后呢,其sing方法完全是失效的,同时继承的子类并不强制要求实现sing方法,要求太宽松了。

class AnimalBaseClass(abc.ABC):
    @abc.abstractmethod
    def sing(self):
        pass

    def say_name(self):
        print(self.name)

抽象类就不一样了,他直接禁止你实例化AnimalBaseClass,同时要求子类必须实现sing方法,哪怕你在子类的sing中直接pass也行,但必须得有,这样我们可以确保子类的sing方法有意义(如果在子类中继续定义sing() pass那是你子类的错和我抽象类有什么关系~~)。
当然对于say_name方法直接使用就可以,这点和普通父类继承一样,所以可以看到抽象类也可以定义普通方法(非抽象方法)
2.所以我们为什么需要抽象类?答案是当然非必须啊,你要喜欢继承普通父类并且随意的重载和增加方法都随意,但是定义抽象类可以使代码更加有逻辑,在规则的驱使下大型项目可以更加便于协作的和后期维护,这个多接触一些项目就明白了。

在Python中我们需要借助内置的抽象基类帮助定义抽象类:

from abc import ABC, abstractmethod

class MyBaseClass(ABC):
    @abstractmethod
    def my_abstract_method(self):
        pass

    def my_regular_method(self):
        return "Hello from MyBaseClass"

class MyDerivedClass(MyBaseClass):
    def my_abstract_method(self):
        return "Hello from MyDerivedClass"
my_derived_instance = MyDerivedClass()
print(my_derived_instance.my_abstract_method())  # Output: Hello from MyDerivedClass
print(my_derived_instance.my_regular_method())   # Output: Hello from MyBaseClass

其中@abstractmethod用于标识一个必须被子类实现的抽象方法,不同于java当中对抽象类定义和继承的各种限制,在python中我们只要继承ABC类即可定义出一个抽象类,其他的地方随你怎么写。

通常情况的,在python中你没有必要定义抽象类,因为抽象类相当于规则的制定者,一般这种角色在开源库或标准包中较为常见,例如xxxBaseClass,当你看到base class这种命名时可以额外注意下,普通父类一般不会这么命名,只有作为其他实体类的抽象基类时才会约定命名为此。

标签:name,Python,子类,self,sing,抽象类,def
From: https://www.cnblogs.com/realcp1018/p/17445555.html

相关文章

  • python~发布自己的py组件
    你使用python写的东西,想让其它人直接使用,可以像java,.net一样,发到包管理平台即可,在python中,你可以使用twine这个工具来实现发布,就像.net里的nuget,java里的mvndeploy一样。本地自己用添加一个hello.py的文件,里面有个say方法,打印字符importsysdefsay(to):print('hel......
  • centos7 安装python3.8.16
    升级openssl下载opensslopenssl官方下载地址:https://www.openssl.org/source/wgethttps://github.com/openssl/openssl/archive/OpenSSL_1_1_1d.tar.gz解压tar-zxvfOpenSSL_1_1_1d.tar.gz编译安装进入openssl-OpenSSL_1_1_1dcdopenssl-OpenSSL_1_1_1d指定安装......
  • python为什么要使用闭包
    为什么要使用闭包闭包避免了使用全局变量,此外,闭包允许将函数与其所操作的某些数据(环境)关连起来。这一点与面向对象编程是非常类似的,在面对象编程中,对象允许我们将某些数据(对象的属性)与一个或者多个方法相关联。一般来说,当对象中只有一个方法时,这时使用闭包是更好的选择。来看一个例......
  • python dijkstra 最短路算法示意代码
     defdijkstra(graph,from_node,to_node):q,seen=[(0,from_node,[])],set()whileq:cost,node,path=heappop(q)seen.add(node)path=path+[node]ifnode==to_node:returncost,pathfora......
  • ​Python 3 新特性:类型注解——类似注释吧,反正解释器又不做校验
    Python3新特性:类型注解Crossin上海交通大学计算机应用技术硕士95人赞同了该文章前几天有同学问到,这个写法是什么意思:defadd(x:int,y:int)->int:returnx+y我们知道Python是一种动态语言,变量以及函数的参数是不区分类型。因此我们定义函数只需要这样写就可以了:def......
  • python deque的内在实现 本质上就是双向链表所以用于stack、队列非常方便
    Howcollections.dequeworks?Cosven  前言:在Python生态中,我们经常使用collections.deque来实现栈、队列这些只需要进行头尾操作的数据结构,它的append/pop操作都是O(1)时间复杂度。list的pop(0)的时间复杂度是O(n),在这个场景中,它的效率没有deque高。那deque内部......
  • python 校验 ipv4 ipv6 格式是否正确,是否属于某网段
    使用python自带的ipaddress模块一、ipv4importipaddress#判断ipv4地址格式是否正确如:ip="192.168.1.101"ip=ipaddress.IPv4Address(ipv4)#判断subnet地址格式是否正确如:subnet="192.168.1.0/24"network=ipaddress.IPv4Network(subnet)#判断ipv4......
  • python 切片
    Python列表切片Python中符合序列的有序序列都支持切片(slice),例如列表,字符串,元组。切片操作基本表达式:object[start_index:end_index:step]切片表达式包含两个":",用于分隔三个参数(start_index、end_index、step),当只有一个":"时,默认第三个参数step=1。start_index:表示起始索......
  • Python 实现进度条
    Python实现进度条1、案例一代码importsysimporttimedefprogress_bar():foriinrange(1,101):print("\r",end="")print("Downloadprogress:{}%:".format(i),"▋"*(i//2),end="")......
  • 【视频】支持向量机算法原理和Python用户流失数据挖掘SVM实例
    全文链接:http://tecdat.cn/?p=32604原文出处:拓端数据部落公众号分析师:BaileyZheng和Lijie Zhang即使是同一种植物,由于生长的地理环境的不同,它们的特征会有所差异。例如鸢尾花,可分为山鸢尾、杂色鸢尾、维吉尼亚鸢尾。假设此时您得到了一朵鸢尾花,如何判断它属于哪一类呢?支......