使用动态生成的方法在Python中实现类继承
我创建了一个模块,其中包括3个主要内容:使用动态生成的方法在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 '''
\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
?