I should give an example.
Python:
class MyClass:
def __init__(self):
self.name = ""
def setname(self, new_name):
self.name = new_name
def getname(self):
return self.name
Usage:
obj = MyClass()
obj.setname("joe")
obj.getname() #==> "joe"
Elixir:
defmodule MyAgent do
def init(), do:
Agent.start_link(fn -> "" end)
def setname(obj, new_name), do:
Agent.update(obj, fn _ -> new_name end)
def getname(obj), do:
Agent.get(obj, &(&1))
end
usage:
{:ok, obj} = MyAgent.init()
MyAgent.setname(obj, "joe")
MyAgent.getname(obj) #==> "joe"
Honestly, superficially, the difference is minor (obviously, under the hood they're way different; ironically I think the Elixir form is far more "explicit" than the python form)