Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用动态生成的方法在Python中实现类继承_Python_Constructor_Python Class - Fatal编程技术网

使用动态生成的方法在Python中实现类继承

使用动态生成的方法在Python中实现类继承,python,constructor,python-class,Python,Constructor,Python Class,我创建了一个模块,其中包括3个主要内容: 一个带有\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu新方法的主类和继承此方法的子类 一个make\u方法装饰器,可以将一个方法关联到现有类: def make_方法(obj): ''Decorator使函数成为*obj*的方法。 在当前上下文中:: @制造方法(轴) def toto(ax,…): ... 使*toto*成为“轴”的一种方法,以便直接使用: ax.toto() 版权所有:来自Yannick Copin '''

我创建了一个模块,其中包括3个主要内容:

  • 一个带有
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu新方法的主类和继承此方法的子类
    
  • 一个
    make\u方法
    装饰器,可以将一个方法关联到现有类:
  • def make_方法(obj):
    ''Decorator使函数成为*obj*的方法。
    在当前上下文中::
    @制造方法(轴)
    def toto(ax,…):
    ...
    使*toto*成为“轴”的一种方法,以便直接使用:
    ax.toto()
    版权所有:来自Yannick Copin
    '''
    定义(f):
    setattr(对象,f.__;u名称,f)
    返回f
    返修
    
  • 一个
    通用
  • 主类有一个
    \uuuuu new\uuuuu
    方法,该方法使用
    make\u方法
    装饰器来创建可用于任何子类的绘图函数。以下是一个例子:

    class MainClass():
    FREEPARAMETERS=['mu_1','sigma_1']
    PLTALL=[“self.param['”+k+“']”表示自由参数中的k]
    定义(cls,*arg,**kwargs):
    ''返回具有动态生成方法的类''
    obj=超级(主类,cls)。\uuuuu新的\uuuuuu(cls)
    exec(“@make\u方法(MainClass)\n”+
    def plot_a(self,x_lin):\n+
    返回自我可能性总和(x林,%s)
    %(“,”.join(MainClass.PLTALL)))
    返回(obj)
    
    然后,如果这样创建一个
    ChildClass

    class子类(MainClass):
    FREEPARAMETERS=['mu_1'、'sigma_1'、'mu_2'、'sigma_2']
    PLTALL=[“self.param['”+k+“']”表示自由参数中的k]
    
    它将有一个
    plot_a
    方法,只需要一个
    x_lin
    ,而不需要手动输入参数(提供了一个采用正确参数的
    似然
    方法)

    所有这些都非常有效(对于我真正需要的东西来说,这可能有点过头了,但这很好)。然后是
    generic
    类:

    class generic():
    ''用法:
    gen=MyModule.generic()
    发电机组模型(“模型”)
    已安装的\u模型\u 1=一般安装(数据集1)
    已安装的\u模型\u 2=一般安装(数据集2)
    已安装的\u模型\u 1.绘图\u a(x\u lin)
    已安装的"模型"2.图"a(x_lin)"
    def set_模型(自身,类名):
    ''将未实例化的类与其字符串''中的self.model关联'
    self.model=getattr(sys.modules[\u\u name\u],classname)
    def拟合(自我,数据集,**kwargs):
    ''用熊猫来实例化类,
    应用“最小化”方法,
    并将其作为输出“”返回
    model=self.model(数据集)
    模型。最小化(**kwargs)
    退货(型号)
    
    正如其文档中所述,其想法是能够调用一个通用模型,例如,我可以向该模型传递不同的数据集,而无需每次手动实例化该类。很好

    执行以下操作时会出现问题,
    ChildClass1
    ChildClass2
    具有不同的
    自由参数

    gen.set\u模型('ChildClass1')
    fitted_childclass1=gen.fit(数据集)
    gen.set_模型('ChildClass2')
    fitted_childclass2=gen.fit(数据集)
    已安装的儿童2.图a(x_lin)
    1.图a(x_lin)
    
    第一个
    plot\u a(x_lin)
    ,与
    generic
    类的最后一个调用关联,工作正常。然而,第二个给了我一个
    keyrorm:'mu_2'
    TypeError:likelion_tot()缺少n个必需的位置参数
    ,这取决于最新实例类和之前实例类之间的
    FREEPARAMETERS
    的相对数量,这意味着,动态生成的
    fitted\u childclass1
    plot\u a
    现在具有
    fitted\u childclass2
    的参数

    然而,当调用
    childclass1.PLTALL
    childclass2.PLTALL
    时,我确实得到了预期的结果。它们在实例化之后似乎不会互换。所有不是动态生成的方法都是正确的

    我当然可以在每个函数之间调用
    plot_a
    函数,但这显然不是重点。我希望
    childclass1
    childclass2
    的行为就像我实例化它们一样:

    childclass1=MyModule.childclass1(数据集)
    childclass1.minimize()
    childclass2=MyModule.childclass2(数据集)
    childclass2.minimize()
    
    make\u方法的使用每次都在改变
    MainClass
    。那肯定不是你的意思;为什么你不能只使用
    classmethod
    ?你对
    make\u方法的使用每次都在改变
    MainClass
    。那肯定不是你的意思;为什么不能使用
    classmethod