Python 从超类实例实例化子类并使其可重置

Python 从超类实例实例化子类并使其可重置,python,Python,我有一个基类a,它有一些重属性(实际上是大的numpy数组),这些属性是从提供给a的\uuuu init\uuu()方法的数据中派生出来的 首先,我想将A子类化为一个新的类B,用一些B的特定方法对这些属性进行修改。由于这些属性的获取非常密集,我不想以与A相同的方式实例化B,但最好使用A实例来初始化B对象。这是a和B之间的类型转换,我想我应该使用\uuu new\uuu()方法返回B对象 第二,在每次计算B的属性之前,我必须确保B的初始状态已恢复到A实例的当前状态,该实例已用于B实例化,无需每次创

我有一个基类a,它有一些重属性(实际上是大的numpy数组),这些属性是从提供给a的
\uuuu init\uuu()
方法的数据中派生出来的

首先,我想将A子类化为一个新的类B,用一些B的特定方法对这些属性进行修改。由于这些属性的获取非常密集,我不想以与A相同的方式实例化B,但最好使用A实例来初始化B对象。这是a和B之间的类型转换,我想我应该使用
\uuu new\uuu()
方法返回B对象

第二,在每次计算B的属性之前,我必须确保B的初始状态已恢复到A实例的当前状态,该实例已用于B实例化,无需每次创建B对象,一种动态链接

下面是我编写的示例代码:

from copy import deepcopy
import numpy as np

class A(object):
    def __init__(self, data):
        self.data=data

    def generate_derived_attributes(self):
        print "generating derived attributes..."
        self.derived_attributes = data.copy()


class B(A):
    def __new__(cls, obj_a):
        assert isinstance(obj_a, A)
        cls = deepcopy(obj_a)
        cls.__class__ = B
        cls._super_cache = obj_a # This is not a copy... no additional memory required
        return cls

    def compute(self):
        # First reset the state (may use a decorator ?)
        self.reset()

        print "Doing some computations..."


    def reset(self):
        print "\nResetting object to its initial state"
        _super_cache = self._super_cache # For not being destroyed...
        self.__dict__ = deepcopy(self._super_cache.__dict__)
        self._super_cache = _super_cache


if __name__ == '__main__':
    a = A(np.zeros(100000000, dtype=np.float))
    a.generate_derived_attributes()
    print a

    b = B(a)
    print b

    b.compute()

    b.compute()

这个实现是用python实现我的目标的一种方式,还是有更多的python方式?我可以更一般一些吗?(我知道在任何情况下使用
\uuuuu dict\uuuu
都不是一个好的选择,尤其是在使用
\uuuu slots\uuuu()
时)。你认为在
B.compute()
周围使用decorator会让我更灵活地将它与其他类一起使用吗?

对代码的任何评论都是受欢迎的:)我认为你应该使用策略pattern@Ciro我认为策略模式对于在运行时选择算法是有用的。我无法在我的特殊情况下看到它的用法。你能更准确一点吗?嗯。。。有趣的。。。让我试着用这种方法来解决我的问题。不,我收回,这帮不了我。