如何在Julia中显示字段值

时间:2018-04-09 06:15:12

标签: oop field julia

我想知道是否有可能在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。

2 个答案:

答案 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倍的加速。