python可直接调用fortran面向对象功能:实例变量、实例方法、静态方法等
软件要求:gfortran >= 8.0 ;python >= 3.10,ifx、ftn95用户就别想了。
第一步:安装gfort2py
python -m pip install --upgrade --user gfort2py
第二步:编译fortran模块文件 生成circle_mod.dll与circle_mod.mod
命令:gfortran -shared -fPIC -o circle_mod.dll circle_mod.f90
Fortran源代码:
! circle_mod.f90
module circle_mod
implicit none
! 定义 circle 类型
type::circle
real::radius !实例变量
contains
procedure,pass(this) :: create_circle !实例方法:构造方法
procedure,pass(this) :: calculate_area !实例方法:计算面积方法
procedure,nopass :: print_name !静态方法: 打印类名
end type circle
type(circle)::a !实例对象
contains
!实例方法:构造方法
subroutine create_circle(this,radius)
class(circle) :: this
real,intent(in)::radius
this%radius = radius
end subroutine create_circle
!实例方法:计算面积
function calculate_area(this)
class(circle), intent(in) :: this
real::calculate_area
calculate_area = 3.141592653589793 * this%radius**2
end function calculate_area
!静态方法: 打印类名 同时也是模块方法
subroutine print_name()
write(*,*)"Circle!"
end subroutine print_name
end module circle_mod
第三步:同一路径下python运行主程序
命令:python circle_mod.py
python源代码:
import gfort2py as gf
mod = gf.fFort(f"./circle_mod.{gf.lib_ext()}","./circle_mod.mod")
mod.a.create_circle(2.0) #实例方法
z=mod.a.calculate_area() #实例方法
print(z.result)
print("Module Method:")
mod.print_name() #模块方法
print("NoPass Method:")
mod.a.print_name() #静态方法
print(mod.a['radius']) #读实例变量
mod.a={'radius':1.0} #写实例变量
print(mod.a['radius']) #读实例变量
z=mod.a.calculate_area() #实例方法
print(z.result)
运行结果:
12.566370964050293
Module Method:
Circle!
NoPass Method:
Circle!
2.0
1.0
3.1415927410125732
以后fortran底层计算+python数据处理、画图、搞界面更加方便了