Как выбрать классы, которые наследуются от TLorentzVector?
Это использует PyROOT (ROOT) и травление. Очень простой пример ниже. Я попытался использовать Как выбрать объект класса B (имеющий много переменных), который наследуется от A, который определяет __setstate__ и __getstate__ в качестве примера.
from ROOT import TLorentzVector
import cPickle as pickle
class MyVec(TLorentzVector):
def __init__(self):
TLorentzVector.__init__(self)
self.a = 'testing'
def __getstate__(self):
return self.__dict__
def __setstate__(self, state):
self.__dict__ = state
a = MyVec()
b = pickle.loads(pickle.dumps(a))
print a.__class__
print b.__class__
print a.__dict__
print b.__dict__
Это выводы
<class '__main__.MyVec'>
<class 'ROOT.TLorentzVector'>
{'a': 'testing'}
{}
Есть идеи, как правильно засолить мой предмет? В частности, я не против не наследовать от TLorentzVector и не перегружать некоторые свойства, которые я использую сам. Но мне все еще непонятно, почему я вообще не могу заставить это работать, потому что это не сохраняет свойства объекта.
1 ответ
Вот то, что я считаю рабочим примером. Мне непонятно, почему это работает, но это должно иметь какое-то отношение к обертыванию cython-классов классом native-python и определению методов для него...
#!/usr/bin/env python
from ROOT import TLorentzVector
import cPickle as pickle
class MyVec(TLorentzVector):
def __init__(self, *args, **kwargs):
print "init"
if len(args) == 2 and isinstance(args[0], pow.__class__):
super(MyVec, self).__init__(args[0](*args[1]))
else:
args = args or (TLorentzVector())
if isinstance(args[0], TLorentzVector):
super(MyVec, self).__init__(args[0])
else:
raise ValueError("Unexpected value")
self.a = kwargs.get('a', 'fake')
self.b = kwargs.get('b', TLorentzVector())
print "args", args
print "kwargs", kwargs
def __setstate__(self, state):
print "setstate"
self.__dict__ = state
def __getstate__(self):
print "getstate"
return self.__dict__
def __reduce__(self):
print "reduce"
return (self.__class__, super(MyVec, self).__reduce__(), self.__getstate__(), )
anotherVec = TLorentzVector()
anotherVec.SetPtEtaPhiM(50.0, 0.0, 0.0, 0.0)
evenMore = TLorentzVector()
evenMore.SetPtEtaPhiM(100.0, 0.0, 0.0, 0.0)
a = MyVec(anotherVec, a='testing', b=evenMore)
b = pickle.loads(pickle.dumps(a))
print a.__class__
print b.__class__
print a.__dict__
print b.__dict__
print a.Pt()
print b.Pt()
print a.b.Pt()
print b.b.Pt()
print a == b
print isinstance(a, MyVec)
print isinstance(b, MyVec)
Это выводы
init
args (<ROOT.TLorentzVector object ("TLorentzVector") at 0x7fa38bce26c0>,)
kwargs {'a': 'testing', 'b': <ROOT.TLorentzVector object ("TLorentzVector") at 0x7fa388f5c740>}
reduce
getstate
init
args (<built-in function _ObjectProxy__expand__>, ('@\x00\x00S\xff\xff\xff\xffTLorentzVector\x00@\x00\x00<\x00\x04\x00\x01\x00\x00\x00\x00\x03\x00\x00\x08@\x00\x00$\x00\x03\x00\x01\x00\x00\x00\x00\x03\x00\x00\x00@I\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@I\x00\x00\x00\x00\x00\x00', 'TLorentzVector'))
kwargs {}
setstate
<class '__main__.MyVec'>
<class '__main__.MyVec'>
{'a': 'testing', 'b': <ROOT.TLorentzVector object ("TLorentzVector") at 0x7fa388f5c740>}
{'a': 'testing', 'b': <ROOT.TLorentzVector object ("TLorentzVector") at 0x7fa38b448be0>}
50.0
50.0
100.0
100.0
True
True
True