oTree: Как получить доступ к идентификатору игрока из класса игрока в model.py?
Я хотел бы определить переменную параметра через атрибут по умолчанию id_in_group игрока. Тем не менее, этот атрибут, кажется, не доступен через способы, которые я мог придумать (например, через BasePlayer.id_in_group).
Код класса игрока:
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?
2 ответа
В другом id_in_group
Атрибут назначается после начала сеанса. Это вполне логично, потому что группы еще не были сформированы до начала сессии.
Вы пытаетесь присвоить значение в объявлении класса Player, когда ни один из игроков не был назначен в группы, таким образом, никто не имеет его / ее id_in_group
,
Кроме того, вы присваиваете значение свойству модели, а не полям конкретных экземпляров (т. Е. Игрокам). Если вам нужно назначить 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
Вы пытались получить доступ к переменной через super.id_in_group
или же self.id_in_group
? Если это переменная родительского класса, вы бы не вызывали этот класс напрямую, как вы это делаете.
Кроме того, у Google есть масса результатов о том, как получить доступ к переменным родительского класса, многие из которых являются ответами от stackru, которые объясняют вещи действительно хорошо:-)