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

时间:2015-11-30 14:29:50

标签: python

我有一个基类A,它有一些重要的属性(实际上是大的numpy数组),这些属性是从给予A {'{1}}方法的数据中得到的。

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

其次,在对B&#39属性进行每次计算之前,我必须确保B的初始状态已经恢复到已用于B实例化的A实例的当前状态,而不创建B每次对象,一种动态的联系......

这是我写的一个示例代码:

__new__()

这个实现是用python实现我的目标的一种方式还是有更多的Pythonic方式......?我可以更通用吗? (我知道在每种情况下使用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() 都不是一个好的选择,特别是在使用__dict__ ...时。您是否认为在__slots__()周围使用装饰器会让我更灵活地将其与其他类一起使用?

0 个答案:

没有答案