在R6类的子类中更改initialize方法
假设我有一个R6类在R6类的子类中更改initialize方法,r,r6,R,R6,假设我有一个R6类人: library(R6) Person <- R6Class("Person", public = list(name = NA, hair = NA, initialize = function(name, hair) { self$name <- name self$hair <- hair self$gre
人
:
library(R6)
Person <- R6Class("Person",
public = list(name = NA, hair = NA,
initialize = function(name, hair) {
self$name <- name
self$hair <- hair
self$greet()
},
greet = function() {
cat("Hello, my name is ", self$name, ".\n", sep = "")
})
)
但是,当我用urname创建classpersons的新实例时,name
和hair
字段是NA
,即classPerson
的默认值
PersonWithSurname$new("John", "Doe", "brown")
Hello, my name is John.
<PersonWithSurname>
Inherits from: <Person>
Public:
clone: function (deep = FALSE)
greet: function ()
hair: NA
initialize: function (name, surname, hair)
name: NA
surname: Doe
R6在这方面与Python非常相似;也就是说,您只需在super
对象上调用initialize
:
PersonWithSurname <- R6Class("PersonWithSurname",
inherit = Person,
public = list(surname = NA,
initialize = function(name, surname, hair) {
super$initialize(name, hair)
self$surname <- surname
})
)
PersonWithUrName实际上在Python中应该使用super()
,而不是父类的名称。这可以防止错误。这有记录在案的地方吗?我在小插曲中找不到任何关于super
的内容。@Tommy确实,文档在这方面有点欠缺,但至少提到了super
,尽管它没有具体解释超类初始化。这种行为可以从R6的(非平凡的)实现中猜测出来。此外,项目包含显示此行为的项目。更新的链接指向。
class Person(object):
def __init__(self, name, hair):
self.name = name
self.hair = hair
self.greet()
def greet(self):
print "Hello, my name is " + self.name
class PersonWithSurname(Person):
def __init__(self, name, surname, hair):
Person.__init__(self, name, hair)
self.surname = surname
PersonWithSurname <- R6Class("PersonWithSurname",
inherit = Person,
public = list(surname = NA,
initialize = function(name, surname, hair) {
super$initialize(name, hair)
self$surname <- surname
})
)