我想知道是否有可能在Julia中显示字段值。
例如,这个程序是在Python中,从消费者类中获取对象变量wealth
:
class Consumer:
def __init__(self, w):
"Initialize consumer with w dollars of wealth"
self.wealth = w
def earn(self, y):
"The consumer earns y dollars"
self.wealth += y
def spend(self, x):
"The consumer spends x dollars if feasible"
new_wealth = self.wealth - x
if new_wealth < 0:
print("Insufficent funds")
else:
self.wealth = new_wealth
c1.wealthc1 = Consumer(10) # Create instance with initial wealth 10
c1.spend(5)
c1.wealth
财富变量是5
。我想知道如何将此代码翻译成Julia。
答案 0 :(得分:2)
Julia 不支持类(就OOP而言)。
但是,composite types可以代表您班级的变量:
type Consumer
wealth::Float64
end
现在,由于Julia不支持类,所有方法都必须在这种类型之外生存,这允许Julia的一个关键特性,多个调度,也可以与用户定义一起使用类型。 (https://docs.julialang.org/en/stable/manual/methods/,https://www.juliabloggers.com/julia-in-ecology-why-multiple-dispatch-is-good/) 因此,您必须添加如下方法:
function earn!(consumer::Consumer, y::Float64)
println("The consumer earns y dollars")
consumer.wealth = consumer.wealth + y
end
(类似地,可以实现spend
功能。)
答案 1 :(得分:2)
最简单的方法与Python非常相似:
mutable struct Consumer
wealth
end
function earn(c::Consumer, y)
c.wealth += y
end
function spend(c::Consumer, y)
c.wealth -= y
end
现在你可以使用它:
julia> c1 = Consumer(10)
Consumer(10)
julia> spend(c1, 5)
5
julia> c1.wealth
5
您可以详细了解here。
但可能在朱莉娅,你会写得像:
mutable struct ConsumerTyped{T<:Real}
wealth::T
end
function earn(c::ConsumerTyped, y)
c.wealth += y
end
function spend(c::ConsumerTyped, y)
c.wealth -= y
end
表面上看起来几乎一样。差异为T
,指定wealth
的类型。有两个好处:您可以在代码中获得类型控制,并且函数运行得更快。
鉴于这样的定义,您唯一需要知道的是构造函数可以用两种方式调用:
c2 = ConsumerTyped{Float64}(10) # explicitly specifies T
c3 = ConsumerTyped(10) # T implicitly derived from the argument
现在让我们比较两种类型的表现:
julia> using BenchmarkTools
julia> c1 = Consumer(10)
Consumer(10)
julia> c2 = ConsumerTyped(10)
ConsumerTyped{Int64}(10)
julia> @benchmark spend(c1, 1)
BenchmarkTools.Trial:
memory estimate: 16 bytes
allocs estimate: 1
--------------
minimum time: 56.434 ns (0.00% GC)
median time: 57.376 ns (0.00% GC)
mean time: 60.126 ns (0.84% GC)
maximum time: 847.942 ns (87.69% GC)
--------------
samples: 10000
evals/sample: 992
julia> @benchmark spend(c2, 1)
BenchmarkTools.Trial:
memory estimate: 16 bytes
allocs estimate: 1
--------------
minimum time: 29.858 ns (0.00% GC)
median time: 30.791 ns (0.00% GC)
mean time: 32.835 ns (1.63% GC)
maximum time: 966.188 ns (90.20% GC)
--------------
samples: 10000
evals/sample: 1000
你看到你得到了~2倍的加速。