在python中,可以在类的方法上使用@property
装饰器,允许将其用作属性。因此,您不是car.tyres()
而是car.tyres
。每次访问car::tyres
时,都会运行某些方法并返回值 - 根据OO范例。这样,您就不需要在对象中存储任何信息,而是在访问时计算它(允许在内存和CPU时间之间进行权衡)。
我现在在R中有一个类似的S4对象并想知道是否
对于(2)我感觉在R中更常见的方法是编写泛型函数tyres()
,然后执行tyres(car)
。但这对我来说并不像OO编程。有人可以详细说明吗?
答案 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)
语法之间引入等价的战斗,在“统一呼叫”的绰号下语法”。