Class 是否可以在Julia中实现类型工厂而不使用'eval()`?

Class 是否可以在Julia中实现类型工厂而不使用'eval()`?,class,julia,factory,Class,Julia,Factory,例如,我有一个基础类型的抽象类型,我想实现一个类型工厂,它在这个抽象类型下动态创建具体类型,名称(和其他类型特征)由用户输入参数给出 abstract type AbstractFoo end function TypeFactory(typename::String, supertype::DataType) ... return ConcreteSubtype end 函数TypeFactory接受typename和supertype参数,并创建一个属于supertype

例如,我有一个基础类型的抽象类型,我想实现一个类型工厂,它在这个抽象类型下动态创建具体类型,名称(和其他类型特征)由用户输入参数给出

abstract type AbstractFoo end

function TypeFactory(typename::String, supertype::DataType)
    ...
    return ConcreteSubtype
end
函数
TypeFactory
接受
typename
supertype
参数,并创建一个属于
supertype
且与
typename
同名的具体类型

我知道这种类工厂在Python中实现并不太困难(例如)。在Julia中,可以通过使用
eval(parse())
计算字符串表达式()来模拟它。但在我看来,这个解决方案并不是面向对象意义上的真正类型工厂。Julia中是否可能有一个类似于OOP语言(Python、C#等)中的类型工厂


编辑[2018年2月8日]:

我的缺点是表达不清楚。我是Julia的新手,最近刚开始用它编写我的项目。我知道继承是不受支持的,也不想在朱莉娅身上到处乱跑

来自Python的背景,我有一种感觉,
eval()
通常用于原型设计,但不用于生产代码。当然,Julia与纯Python不同,它的效率远远高于纯Python,但是提供给
eval()
的代码仍然必须在运行时编译(如果我错了,请纠正我)。从性能的角度来看,它的使用也被分类为不鼓励()

“用户输入”并不仅仅指命令行输入。它们可以由用户的配置文件提供。(尽管如此,@SalchiPapa的宏解决方案既贴切又优雅!)

是否可以在Julia中实现类型工厂而不使用
eval()

您可以使用宏:

宏提供了一种将生成的代码包含在程序最终主体中的方法。宏将参数元组映射到返回的表达式,直接编译生成的表达式,而不需要运行时
eval()
call

julia>版本
v“0.7.0-DEV.2098”
朱莉娅>模块工厂
出口@工厂
宏工厂(类型\名称::符号,超级\类型::符号)
# ...
返回报价
使用Main.Factory:@Factory的结构$type\u名称
julia>抽象类型AbstractFoo end
朱莉娅>@factory ConcreteFoo AbstractFoo
混凝土食品
julia>foo=ConcreteFoo(42)
康特福(42)
朱莉娅>福吧
42
julia>ConcreteFoo超类型(ConcreteFoo)
AbstractFoo
根据注释中的@Gnimuc理解,使用
输入进行编辑

julia>模块工厂
出口@工厂
函数输入(prompt::String=”“)::String
打印(提示)
返回chomp(readline())
结束
宏工厂(类型名称=输入(“类型名称:”)
AbstractT=符号(:抽象,类型\名称)
混凝土=符号(:混凝土,类型\名称)
返回报价
抽象类型$(esc(AbstractT))结束
使用Main.Factory:@Factory的结构$concrete
朱莉娅>@工厂
类型名称:Foo
(AbstractFoo,ConcreteFoo)
朱莉娅>@工厂
类型名称:Bar
(钢筋、混凝土钢筋)
朱莉娅>@factorybaz
(AbstractBaz,ConcreteBaz)
julia>foo=ConcreteFoo(42)
康特福(42)
朱莉娅>福吧
42
julia>ConcreteFoo超类型(ConcreteFoo)
AbstractFoo
朱莉娅>@macroexpand@factory
类型名称:Qux
引用
#=REPL[1]:13=#
抽象类型AbstractQux结束
#=REPL[1]:14=#
结构混凝土质量评估(ans)
(AbstractQux,ConcreteQux)

您所说的“不是面向对象意义上的真正类型工厂”是什么意思?IIUC,您正在寻找Python中类似于
type()
的东西,对我来说,这正是链接答案中方法2中的
createTypeAST
+
eval
。这是一个帮助函数,允许用户在运行时动态创建一个新类型,我想知道这与OOP有什么联系。@Gnimuc我想他指的是继承。@Gnimuc谢谢你的提问。我不清楚。我想我希望它像函数一样,返回具体的类型,而不是使用
eval()
计算的表达式。一个原因是预编译的代码比运行时执行
eval
-ed的代码要快。此外,我认为在生产代码中编写函数(和宏)更优雅,尽管这可能只是个人喜好。正如OP所说的“使用用户输入参数给出的名称”,也许我们需要在宏中添加
type_name=readline(STDIN)|>Symbol
。但我认为这是一种运行时信息,在宏实现中插入readline函数是最佳实践吗?我很好奇Python是如何实现其
type()
函数的。@gnimum我已经更新了我的答案,并考虑了您的评论。