我有一个基类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__()
周围使用装饰器会让我更灵活地将其与其他类一起使用?