scala相当于python __getattr__ / __setattr__

时间:2012-05-18 19:55:53

标签: python scala dynamic properties getter-setter

是否有scala等效的python __getattr__ / __setattr__(以及其他__*__方法?)。有些东西是内置的还是某些特征?

2 个答案:

答案 0 :(得分:11)

对于__getattr____setattr__,您必须等到有更多洞察力的人描述新的Scala 2.10反射API。 (当然:它不会直接翻译。它完全取决于你的用例。如果你只想要一个动态的类,将来会有一个Dynamic特性;如果你只是想要一个小的这一点,然后围绕模式匹配进行设计可能是一个明显的选择。)

对于众多other __*__ methods in Python

全球事物

  • __call__apply() //几乎完全相同的行为
  • __metaclass__ //依赖于用例:
    • 目前class继承或trait mixins可能有用
    • 在很多情况下,元类所做的只是实例构造,它避免调用super();在Scala super()中始终在构造函数中调用。
  • __repr____str__toString()
  • __eq__equals()
  • __init__ //在类主体中隐式调用
  • __new__ //不直接存在;取决于用例 early initialisation
  • __del__ // 缺少
  • __nonzero__ //不是真的,除了implicit def toBool[MyType](a: MyType): Boolean = ...

容器类型

  • __len__lengthsize或容器中的约定
  • __getitem__apply(i: IndexType) //容器是Scala中的函数
  • __setitem__update(i: IndexType, v: ValueType)
  • __delitem__ //无需特殊处理;容器惯例
  • __iter__foreach(block: ValueType => Unit) //返回值为:mapflatMap

值得注意的是,applyupdate在Scala中是特殊,就像他们的Python对应物一样。它们允许以下语法:

val x = collection(elem) // val x = collection.apply(elem)
collection(elem) = y // collection.update(elem, y)

同样,正如Python __iter__允许使用(el for el in container) foreachmap这样的语法,可以说for (el <- container) yield el

通常不需要特殊处理,因为我们可以直接定义

  • __add____sub__,... //只需定义def + (arg: T)def - (arg: T)

这还包括比较运算符

  • __lt____ge__def <(other: T)def <=(other: T)

然而,就像在Python中一样,编译器中有一些特殊情况用于高级事物:

  • __radd____rsub__,... //右关联运算符;约。 def +: (arg: T)def -: (arg: T)(附加:
  • __iadd____isub__,... //修改运算符:def += (arg: T),...

上下文管理器

  • __enter____exit__ //在大多数情况下,函数参数实现了相同的目的

另请参阅:List of Scala's "magic" functions

答案 1 :(得分:2)

我不确定这里有什么意义。 Scala的统一访问原则意味着“字段”和方法共享相同的接口 - 因为事实上,Scala中的“字段”是getter和setter。

换句话说,您可以像这样替换它们:

var x: Int = 0

private[this] var _x = 0
def x = _x
def x_=(n: Int) { _x = n }

getter和setter方法将控制对您声明的私有字段的访问。

现在,如果您想要的只是一种提供非静态字段的方法,那么您必须查看动态特征。它的实验性高达2.9.2,但它将在2.10上可用,但是在一个标志后面警告人们这个功能是危险的(因为它引入了动态类型,但如果你不认为动态类型是危险的,你应该是细)。

相关问题