S4对象中的属性装饰器(R)

时间:2016-09-19 13:04:31

标签: python r properties

在python中,可以在类的方法上使用@property装饰器,允许将其用作属性。因此,您不是car.tyres()而是car.tyres。每次访问car::tyres时,都会运行某些方法并返回值 - 根据OO范例。这样,您就不需要在对象中存储任何信息,而是在访问时计算它(允许在内存和CPU时间之间进行权衡)。

我现在在R中有一个类似的S4对象并想知道是否

  1. 这可以在R中用于S4对象和
  2. 这是否是R的好习惯?
  3. 对于(2)我感觉在R中更常见的方法是编写泛型函数tyres(),然后执行tyres(car)。但这对我来说并不像OO编程。有人可以详细说明吗?

2 个答案:

答案 0 :(得分:1)

我从未在S4中找到过这样做的方法。但这在R6对象中肯定是可能的。它被称为Active binding

R6对象允许使用$运算符直接从对象实例访问属性和调用成员方法,类似于其他OOP语言,如Java和C ++。这使得R中的OOP代码比S3和S4对象更加自然。

答案 1 :(得分:1)

  

关于(2)我觉得在R中更常见的方法是编写泛型函数tyres(),然后执行tyres(car)

绝对。这是R中的自然方式,它具有暴露统一界面 1 的优势。

  

但这对我来说似乎不是OO编程。

为什么不呢? OOP与语法object.method()无关,尽管这是一种常见的看法(由于C ++,C#,Java和Python等语言的商业成功,都遵循这种通用语法)。实际上OOP是关于数据封装和一组松散的原则,以使对象相互通信。

不同的语言必然会以不同的方式处理。 R6非常巧妙地模仿类似Java的语法到面向对象,它的使用在某些场景中可能有意义。但S3的语法同样面向对象,并且更像R:它的语法更容易与其他R函数组合。

1 旁注:C ++标准委员会目前正在进行一场关于在foo.bar(baz)bar(foo, baz)语法之间引入等价的战斗,在“统一呼叫”的绰号下语法”。