是和继承有啥区别?

Posted

技术标签:

【中文标题】是和继承有啥区别?【英文标题】:What's the difference between is and inherits?是和继承有什么区别? 【发布时间】:2015-03-11 11:31:07 【问题描述】:

如果我想检查一个变量是否继承自某个类,我可以使用isinherits

class(letters)
## [1] "character"
is(letters, "character")
## [1] TRUE
inherits(letters, "character")
## [1] TRUE

我应该使用哪个偏好,它们是否会返回不同的值?

【问题讨论】:

@Richie 正如您提出并回答了这个问题,您能否将"character" %in% class(letters) 包含在您的问题/答案中?我对这篇文章的理解是它相当于继承,只是速度较慢,但​​我不确定。 @Moody_Mudskipper 是的,这也可以,虽然代码的意图不太清楚,所以我不确定你什么时候想要使用它。 我在这个答案中使用了它,例如:***.com/questions/18746456/simplified-dput-in-r。 is.list(iris)TRUE"list" %in% class(iris)inherits(iris,"list")FALSE,这对于区分 data.frames 和列表很有用。我是否应该明白,为了敲钉子,后两者确实是等价的,并且您在所有情况下都推荐inherits?顺便说一句,你漂亮的数据营课程把我带到了这里。 【参考方案1】:

短版:

使用 inherits,但要小心数字和 S4 类。


加长版:

来自is 帮助页面的“另请参阅”部分:

对于 S4 和非 S4,继承几乎总是等同于 is 对象,并且速度更快。不等价适用于 具有条件超类的类,具有非平凡的测试= 在关系中(不常见且不鼓励):对于这些,是测试 该关系但根据定义继承忽略条件 S4 对象的继承。

来自inherits 帮助页面的正式类部分:

形式类的继承类比是is。两个函数 行为一致,但有一个例外:S4 类可以有 条件继承,带有显式测试。在这种情况下,将 测试条件,但继承忽略所有条件超类。

所以他们大多返回相同的东西,但inherits 更快,所以在大多数情况下它应该是默认选择。 (正如 Konrad 所提到的,is 还要求加载 methods 包,这可能使其不适合对性能敏感的 Rscript 使用。)

如果您使用具有条件继承的 S4 类,值可能会有所不同,但这是not recommended(请参阅“方法选择和调度:详细信息”部分),这意味着它希望很少见。

这两个函数最明显的不同之处在于检查整数是否为数字。

class(1L)
## [1] "integer"
is.numeric(1L)
## [1] TRUE
is(1L, "numeric")
## [1] TRUE
inherits(1L, "numeric")
## [1] FALSE

【讨论】:

好的,你能解释一下为什么整数不“继承”,而浮点数可以: Rgames> class(1.4) [1] "numeric" Rgames> 是。 numeric(1.4) [1] TRUE Rgames> 继承(1.4,'numeric') [1] TRUE Rgames> is(1.4,'numeric') [1] TRUE 我认为这可能与数字对象仅具有 implicit 类的事实有关:来自?classIf the object does not have a class attribute, it has an implicit class, ‘"matrix"’, ‘"array"’ or the result of ‘mode(x)’ (except that integer vectors have implicit class ‘"integer"’). 我可以想象(??)@ 987654333@ 会查看隐式类,而 inherits 不会...? 我记得无意中听到高 R 受试者的评论称这是“不公平”。 另一个非常关键的区别是is 在包methods 中,运行Rscript 时默认不加载(因为加载速度很慢)。相比之下,inherits 来自 base,因此很容易在 R 脚本程序中使用。

以上是关于是和继承有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

多表继承模型和相同两个模型之间的简单一对一关系有啥区别?

java 实现接口和继承有啥区别

java中接口和类有啥区别 java中接口和类有啥区别

java中like和likes有啥区别

重载和覆写有啥区别?

Java中,接口继承接口时,用implements与extends有啥区别?