在Python中创建一个模板类,使子类从父类继承参数

在Python中创建一个模板类,使子类从父类继承参数,python,python-3.x,Python,Python 3.x,我这里有一些问题。我试图优化我的代码,并且使用line_profiler发现我的大部分时间都花在类实例化上。下面是我要做的事情的总结,以及我是如何做到这一点的 我有三个类:Template、Individual、Collective,大致设置如下:(不是实际的代码,但足够接近,可以建立我试图做的更具体的想法 class Template: def __init__(self, param_boundaries): self.param_boundaries = p

我这里有一些问题。我试图优化我的代码,并且使用line_profiler发现我的大部分时间都花在类实例化上。下面是我要做的事情的总结,以及我是如何做到这一点的

我有三个类:Template、Individual、Collective,大致设置如下:(不是实际的代码,但足够接近,可以建立我试图做的更具体的想法

class Template:
      def __init__(self, param_boundaries):
          self.param_boundaries = param_boundaries

class Individual(Template):
      def __init__(self, i_params, template):
          self.i_params = i_params
          self.template = template

      def method_example(self):
          #modifies i_params based on self.template.param_boundaries

class Collective:
      def __init__(self, n, template):
          #creates n random Individuals using the Template
line_profiler显示,最大的障碍是line self.template=template。事实上,即使不是这样,它也会占用更多的内存,因为它需要将整个模板保存在每个个体中。我的问题是,是否有一种方法可以简单地引用从个体传递到模板中的参数,而不必进行修改必须在单个词典中保存模板

以下几点可能有用: 1) 模板实例化后将不会被修改。 2) 个人之间不进行交流 3) 集合仅使用模板生成个人 4) 我正在使用Python 3.7


请让我知道,如果需要任何其他信息,或者如果这是一个副本。老实说,我没有足够的词汇来真正搜索我要做的事情。在发布之前,我已经试着寻找一些东西,但我没有任何运气。

似乎您对面向对象方法中的继承概念(以及它在Python中的工作方式)了解得不够

当您从
Template
继承时,您的派生类也是一个“模板”,除了在您在子类主体中编写的任何代码中进行扩展或细化之外

如果“模板”可以保存在属性中,那么您将看到类组合,它通常比继承更容易理解和使用

然而,要正确使用iheritance,任何想要很好地工作的方法都需要调用相应的超类方法——在Python中,它是通过内置的demi-magic
super
完成的——您的代码如下所示:

class Template:
      def __init__(self, param_boundaries):
          self.param_boundaries = param_boundaries

class Individual(Template):
      def __init__(self, i_params, param_boundaries):
          self.i_params = i_params
          super().__init__(param_boundaries)


      def method_example(self):
          #modifies i_params based on self.template.param_boundaries

class Collective:
      def __init__(self, n, param_boundaries):
          super().__init__(param_boundaries)
          #creates n random Individuals using the Template

因此-您的“个人”和“集体”类是同一类型的“模板”确实有一个
.param\u bounders
属性,该属性是在
模板中创建的。uu init\uuu
函数,可使用
super()…
调用访问

如果您希望两者都有一个“template”属性,而该属性是一个“template”类,则它们不应继承自
template
,而应声明为:

class个人:
定义初始化(self,i参数,模板):
self.i_参数=i_参数
self.template=模板
然后它将在没有任何意外的情况下工作

至于
self.template=template
行中的“障碍”:那不可能发生!
Python所做的一切就是创建一个对已经构建的对象的新引用,它尽可能地简单-如果它确实在您的概要文件中列出,并且占用的资源比其他任何东西都多,那么您在概要文件中看到的只是噪音(也就是说,值太低,在不同的运行中会有所不同,如果它们没有变化,在Python代码中仍然无法使它们更快),您根本无法对其进行优化。

不,这不是正在发生的事情。赋值从不创建副本,所发生的事情是正在创建对模板对象的新引用。这不是问题的根源。您能举个例子说明这些类是如何使用的吗?只是定义不正确非常有用。我明白了。也许我对line_profiler的输出的解释是不正确的。因为据我所知,它不适用于类初始化,所以我创建了一个虚拟对象来解决这个限制,这就是为什么line_profiler将大部分时间花在self.template分配上的原因。必须有其他因素在起作用我不知道。@juanpa.arrivillaga,我不能分享实际的代码,因为我不想在工作场所的严格政策中遇到麻烦,但我可以分享的是,这是一个遗传算法的实现。模板存储了边界、交叉变异和适应度函数、布尔值和工程。每个人然后参考当“交配”时,它们会发生变化或者变异。集体只是个体的集合,处理父选择和其他事情。不,这不是我的意思。你必须明确,你的描述太高,太笼统,没有任何用处。你永远不应该分享你的全部代码。相反,制作一个复制你的问题的程序。你不必透露任何实际的商业逻辑。但你必须给出一个你实际在做什么的例子。你在很多方面都是正确的。我完全自学成才,我反复检查,是的,结果是噪音,因为它每次都给我不同的结果。结果证明,由于某种原因,我编程错误,我一直忽略它坦白地说,几天来每次都很尴尬。