Python 从超类实例实例化子类并使其可重置
我有一个基类a,它有一些重属性(实际上是大的numpy数组),这些属性是从提供给a的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实例化,无需每次创
\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我认为策略模式对于在运行时选择算法是有用的。我无法在我的特殊情况下看到它的用法。你能更准确一点吗?嗯。。。有趣的。。。让我试着用这种方法来解决我的问题。不,我收回,这帮不了我。