Python:通过函数构造类(和变量名)?

Python:通过函数构造类(和变量名)?,python,class,otree,Python,Class,Otree,我最近开始使用Python的类,因为我需要通过使用OTree来使用它,OTree是一个用于在线实验的Python框架 在一个文件中,我使用类定义要创建的页面。所以本质上,在OTree系统中,每个类对应一个新页面。问题是,除了一些两个参数外,所有页面(所以类)基本相同,如下代码所示: class Task1(Page): form_model = 'player' form_fields = ['Envie_WordsList_Toy'] def is_displayed(

我最近开始使用Python的类,因为我需要通过使用OTree来使用它,OTree是一个用于在线实验的Python框架

在一个文件中,我使用类定义要创建的页面。所以本质上,在OTree系统中,每个类对应一个新页面。问题是,除了一些两个参数外,所有页面(所以类)基本相同,如下代码所示:

class Task1(Page):
    form_model = 'player'
    form_fields = ['Envie_WordsList_Toy']
    def is_displayed(self):
        return self.round_number == self.participant.vars['task_rounds'][1]
    def vars_for_template(player):
        WordsList_Toy= Constants.WordsList_Toy.copy()
        random.shuffle(WordsList_Toy)
        return dict(
            WordsList_Toy=WordsList_Toy
        )
    @staticmethod
    def live_method(player, data):
        player.WTP_WordsList_Toy = int(data)
    def before_next_page(self):
        self.participant.vars['Envie_WordsList_Toy'] = self.player.Envie_WordsList_Toy
        self.participant.vars['WTP_WordsList_Toy'] = self.player.WTP_WordsList_Toy
因此在这里,唯一会改变的是类的名称,以及在整个代码中使用的变量
WordsList\uuu
的后缀,即
Toy

天真地说,我试图定义一个函数,它将接受这两个参数,例如:

def page_creation(Task_Number,name_type):
    class Task+str(Task_Number)(Page):
        form_model = 'player'
        form_fields = ['Envie_WordsList_'+str(name_type)]

        def is_displayed(self):
            return self.round_number == self.participant.vars['task_rounds'][1]

        def vars_for_template(player):
            WordsList_+str(name_type) = Constants.WordsList+str(name_type).copy()
            random.shuffle(WordsList_+str(name_type))
            return dict(
                WordsList_+str(name_type)=WordsList_+str(name_type)
            )

        @staticmethod
        def live_method(player, data):
            player.WTP_WordsList_+str(name_type) = int(data)

        def before_next_page(self):
            self.participant.vars['Envie_WordsList_+str(name_type)'] = self.player.Envie_WordsList_+str(name_type)
            self.participant.vars['WTP_WordsList_+str(name_type)'] = self.player.WTP_WordsList_+str(name_type)

显然,它不起作用,因为我觉得用这种方式构造变量(或类标识符)是不可能的。几周前我才开始真正研究Python,所以它的某些方面可能仍然让我难以理解。你能帮我解决这个问题吗?谢谢。

您可以使用
类型
构造函数生成动态类:


MyClass=type(“MyClass”,(BaseClass1,BaseClass2),{“attr1”:“value1”,…})
因此,根据你的情况,这将是:

cls=type(f“Task{TaskNumber}”(第页,),{“form_字段”:[f“Envive_单词列表{name_type}],…})
请注意,您仍然需要构造常用方法,如
\uuuu init\uuuu
显示为类工厂的内部函数等:

def class_工厂(*args,**kwargs):
...
显示def(自我):
返回self.round\u number==self.participant.vars['task\u rounds']
def vars_用于_模板(播放器):
...
#类方法包装在下面完成
def live_方法(播放器、数据):
...
cls=类型({
“是否显示”:是否显示,
“vars_for_模板”:vars_for_模板,
“现场方法”:classmethod(现场方法),
...,
}

@classmethod
可以用作函数-
{“live\u method”:classmethod(my\u method)}

谢谢你的回答。但是,我仍然在努力定义类范围内的函数。例如,对于
isdisplayed
,我在哪里定义
return self.round\u number==self.participant.vars['task\u rounds'][1]