R開發 part10 基於S3的物件導向程式設計

2021-10-09 01:56:07 字數 4406 閱讀 2218

學習筆記,僅供參考,有錯必糾

r語言中有三種物件導向的程式設計實現,即s3型別、s4型別和rc型別。s3和s4都是基於泛型函式的,rc則是完全的物件導向實現。

物件導向的r語言實現

定義老師物件和行為,封裝到teacher()泛型函式中;

定義同學物件和行為,封裝到student()泛型函式中.

#定義老師物件和行為

teacher <- function(x, ...) usemethod("teacher")

teacher.lecture <- function(x) print("講課")

teacher.assignment <- function(x) print("布置作業")

teacher.correcting <- function(x) print("批改作業")

teacher.default<-function(x) print("你不是teacher")

#定義同學物件和行為

student <- function(x, ...) usemethod("student")

student.attend <- function(x) print("聽課")

student.homework <- function(x) print("寫作業")

student.exam <- function(x) print("考試")

student.default<-function(x) print("你不是student")

#定義變數a和b

a <- "teacher"

b <- "student"

attr(a, "class") <- "lecture"

attr(b, "class") <- "attend"

teacher(a) #"講課"

student(b) #"聽課"

#把老師和同學的行為都賦予到乙個變數ab上

ab <- "teacher_student"

#分別設定不同物件的行為

attr(ab, "class") <- c("assignment", "homework")

#執行老師的行為

teacher(ab) #"布置作業"

#執行同學的行為

student(ab) #"寫作業"

基於s3的物件導向程式設計

在r語言中,基於s3物件的物件導向程式設計,是一種基於泛型函式的實現方式。泛型函式是一種特殊的函式,根據傳入物件的型別決定呼叫哪個具體的方法。基於s3物件實現的物件導向程式設計,不同於其他語言的物件導向程式設計,是一種動態函式呼叫的模擬實現。。s3物件被廣泛應用於r的早期的開發包中。

建立s3物件最簡單的方法就是給乙個變數增加class屬性:

x <- 1

#定義為s3型別物件

attr(x, "class") <- "foo"

x#輸出start

[1] 1

attr(,"class")

[1] "foo"

#輸出end

otype(x) #"s3"

也可以通過structure函式建立s3物件:

#建立s3型別物件

y <- structure(

10, class =

"foo")y

#輸出start[1

]10attr(

,"class")[

1]"foo"

#輸出end

otype(y)

#"s3"

s3物件沒有明確的結構關係,乙個s3物件可以有多個型別。s3物件型別,通過變數的class屬性來定義,class屬性可以是乙個向量,所以允許多型別:

z <- 5

attr(z, "class") <- c("foo", "bar")

class(z) #"foo" "bar"

otype(z) #"s3"

泛型函式和方法呼叫

對於s3物件的使用,通常用usemethod函式來定義乙個泛型函式的名稱,通過傳入引數的class屬性來確定不同的方法呼叫:

#用usemethod定義teacher泛型函式

teacher <- function(x, ...) usemethod("teacher")

#函式檢查teacher的型別

ftype(teach)

#用teacher.***的語法格式定義teacher物件的行為

teacher.lecture <- function(x) print("講課")

teacher.correcting <- function(x) print("批改作業")

#teacher.default定義預設行為

teacher.default<-function(x) print("teacher預設行為")

方法呼叫時,通過傳入引數的class屬性來確定不同的方法呼叫,比如,我們定義乙個變數a,並設定a的class屬性為lecture,將變數a傳入teacher泛型函式中,teacher.lecture函式就會被呼叫:

a <- "teachera"

attr(a, "class") <- "lecture"

#執行老師的行為

teacher(a)

當然,我們也可以直接呼叫teacher中定義的行為,如果這樣做就失去了物件導向封裝的意義:

teacher.lecture() #"講課"

teacher.lecture(a) #"講課"

teacher() #"teacher預設行為"

對比其他語言,這裡r的泛型函式就表示方法介面,teacher.***表示介面的方法實現。

檢視s3物件的函式

當我們使用s3物件進行物件導向封裝後,可以用methods函式來檢視s3物件中定義的內部行為函式:

#檢視teacher物件

teacher

#輸出start

function(x, ...) usemethod("teacher")

#輸出end

#檢視teacher物件的內部函式

methods(teacher)

#輸出start

teacher.assignment teacher.correcting teacher.default teacher.lecture

#輸出end

用getanywhere函式檢視函式:

#檢視teacher.lecture

getanywhere(teacher.lecture)

#輸出start

a single object matching 『teacher.lecture』 was found

it was found in the following places

.globalenv

registered s3 method for teacher

with value

function(x) print("講課")

#輸出end

#檢視不可見的函式predict.ppr

getanywhere(predict.ppr)

#輸出略

使用gets3method函式檢視不可見的函式:

gets3method("predict", "ppr")

#輸出略

s3物件的繼承呼叫方式

s3物件可以用nextmethod函式來實現繼承呼叫:

node <- function(x) usemethod("node", x)

node.default <- function(x) print("預設node")

node.father <- function(x) c("father") #father函式

node.son <- function(x) c("son", nextmethod()) #son函式

n1 <- structure(1, class = c("father"))

n2 <- structure(2, class = c("son", "father"))

node(n1) #"father"

node(n2) #"son" "father"

通過對node函式傳入n2的引數,node.son先被執行,然後通過nextmethod函式繼續執行node.father函式。其實這樣就模擬了子函式呼叫父函式的過程,實現物件導向程式設計中的繼承。

s3物件的缺點

python基礎 part10 函式

鄙人學習筆記 開發工具 spyder 可變與不可變型別資料在傳參時的區別 函式引數 命名關鍵字形參 引數自左至右的順序 函式用於封裝乙個特定的功能,表示乙個功能或者行為。函式是可以重複執行的語句塊,可以重複呼叫。函式可以提高 的可重用性和可維護性。注意函式命名和清晰性 def 函式名 形式引數 函式...

中小企業通用工藝part10

2006 04 19 17 17 42 十二 塗漆通用工藝 1範圍 本守則規定了塗漆加工的工藝規則,適用於本公司的塗漆加工。2除鏽 2.1 對工件表面的型沙 毛刺 焊渣 飛濺物 油汙 灰塵等物用破皮及鋼絲刷等除鏽工具刮,鏟清除乾淨,使其達到平整 清潔,提高塗層的附著力。2.2 鏽蝕等級見表 a全面地...

Part 10 網路程式設計 網路通訊過程

一 集線器組網 集線器 hub 是指將多條乙太網雙絞線或光纖集合連線在同一段物理介質下的裝置。發生在物理層。集線器工作的時候,如果區域網中的一台電腦要傳送訊息,則區域網內的所有電腦都可以接收到這個訊息,安全性較差,而且每一次只能有乙個傳送,只有這個傳送完畢其他電腦才能再傳送,這稱為半雙工模式。詳細通...