oTree:如何从model.py中的播放器类访问播放器的ID?

问题描述:

我想通过播放器的默认属性id_in_group定义一个参数变量。但是,这个属性似乎不能通过我能想到的方式访问(比如通过BasePlayer.id_in_group)。oTree:如何从model.py中的播放器类访问播放器的ID?

类播放器的代码:

class Player(BasePlayer): 
    investment_amount = models.CurrencyField(
     doc=""" 
     Amount invested by this player. 
     """, 
     min=0, max=Constants.endowment 
    ) 
    random_number = BasePlayer.id_in_group 

    def set_payoffs(self): 
     for p in self.get_players(): 
      p.payoff = 110 

我怎么能访问属性id_in_group?或者它是不可能的,因为它是由oTree预设的默认属性?

+0

为什么你要定义' random_number'呢? –

+0

不同的图片会显示给与此随机数对应的不同主题。 – Aqqqq

+0

但是,为什么你不使用'id_in_group'?为什么将它分配给不同的名称? –

您是否尝试过通过super.id_in_groupself.id_in_group访问变量?如果它是父类的变量,则不会像您所做的那样直接调用该类。

此外,谷歌有一吨结果如何访问父类变量,其中很多是来自计算器的答案来解释的东西真的很好:-)

+0

当我使用“super”时,错误是:type object'super'没有属性'id_in_group';当我使用'自我'时,错误是:未解决的参考'自我'。我认为这与父母班没有任何关系。但谢谢你的答案。 – Aqqqq

+0

你可以发布BasePlayer类代码吗?看起来很奇怪,假设你的继承设置正确,'self'不能解决问题。 –

+0

'超级'是一个函数,无论如何在这一点上都没有意义; 'self'只能在方法中使用。 –

在oTree的id_in_group属性在会议结束后的分配开始。这很合乎逻辑,因为在会议开始之前还没有形成小组。

如果没有玩家分配到组,则尝试在Player类声明中分配一个值,因此没有人拥有他/她的id_in_group。此外,您为模型的属性赋值,而不是赋予特定实例(即玩家)的字段。如果你需要根据他/她的组ID分配给random_id场每个球员的具体值请执行以下操作:

models.py

class Player(BasePlayer): 
    random_id = models.IntegerField() 

class Subsession(BaseSubsession): 
    def before_session_starts(self): 
     for p in self.get_players(): 
      p.random_id = p.id_in_group