oTree學習教程(一)概念性概述
概念概述
Sessions
在oTree中,會話是指多個參與者參與一系列任務或遊戲的事件。會話的一個例子是:
“許多參與者將來到實驗室並進行公共產品遊戲,然後進行問卷調查。參與者獲得的獎金為10.00歐元,加上他們從遊戲中獲得的收入。“
Subsessions
會話是一系列的子會話; 子會話是構成會話的“部分”或“模組”。例如,如果一個會話由一個公共產品遊戲和一個問卷調查組成,那麼公共產品遊戲將是子會話1,而調查問卷將是一個子會話2.反過來,每個子會話都是一系列頁面。例如,如果你有一個4頁的公共產品遊戲,然後是一個2頁的問卷:
如果遊戲重複多輪,則每輪都是一個子會話。
Groups
每個子會話可以進一步劃分為一組玩家; 例如,你可以擁有30名玩家,分為15組,每組2名玩家。(注意:組可以在子會話之間進行混洗。)
Object hierarchy(物件層次結構)
oTree的實體可以安排在以下層次結構中:
- 會話是一系列子會話
- 子會話包含多個組
- 一組包含多個玩家
- 每個玩家通過多個頁面進行
Participant
在oTree中,術語“玩家”和“參與者”具有不同的含義。參與者和玩家之間的關係與會話和子會話之間的關係相同:
玩家是一個特定子級別中的參與者的例項。玩家就像是參與者扮演的臨時“角色”。參與者可以是第一個子賽中的球員2,下一個賽季中的球員1等。
What is “self”?
在Python中,self
是您當前所在類的例項。如果您想知道self
特定上下文中的含義,請向上滾動,直到看到該類的名稱。
例如,在此程式碼中,self
是一個玩家(Player
該類的一個例項)。
這個名字self
比player
它更短更方便。
這類似於人們在談論自己時不使用自己的名字的方式; 他們只使用“我”,“我自己”和“我”之類的代詞。所以,self
基本上是一個代名詞。
Functions vs. attributes
類具有屬性和功能。
以下是具有屬性的頁面示例
這意味著此頁面的時間限制為60秒。
但是,如果您希望時間限制是動態的呢?也許它應該取決於當前的輪數,或者取決於玩家到目前為止的表現。
要解決這個問題,我們需要使它成為當前頁面的函式,如下所示:
首先,讓我們看一下def get_timeout_seconds(self)行: def意味著我們定義了一個名為get_timeout_seconds的函式。它是一個函式,因此它具有輸入和輸出。 輸入(即引數)稱為self,它是頁面的當前例項。“例項”是什麼意思? 雖然許多玩家會多次檢視“Results”頁面,但是self具有關於當前頁面檢視的特定屬性。例如,self.round_number為我們提供當前的輪數,self.player為我們提供當前正在檢視頁面的玩家,self.session為我們提供了當前正在進行的會話。
總之,如果你定義一個屬性,那麼它對所有玩家都是一樣的。 如果你想要一個與玩家不同的東西,你需要使用一個帶引數self的函式。 有時,oTree提供兩種選擇。 例如,oTree提供timeout_seconds屬性(對於具有固定時間限制的簡單頁面)和get_timeout_seconds函式(對於具有動態時間限制的複雜頁面)。
Self: extended examples(Self:擴充套件示例)
您可以訪問哪些屬性self
?
下面是一個如何在程式碼中引用層次結構中的物件的圖表:
例如,如果您使用的是Player類中的方法,則可以使用self.payoff訪問玩家的回報(因為self是玩家)。 但是如果你在pages.py中的Page類中,則等效表示式是self.player.payoff,它將指標從“page”遍歷到“player”。
以下是一些程式碼示例:
在你的 models.py
在你的 pages.py