# http://stackoverflow.com/questions/11979194/subclasses-of-pandas-object-work-differently-from-subclass-of-other-object import pandas as pd class Support(pd.Series): def __new__(cls, *args, **kwargs): arr = Series.__new__(cls, *args, **kwargs) return arr.view(Support) def supportMethod1(self): print 'I am support method 1' def supportMethod2(self): print 'I am support method 2' class Compute(object): supp=None def test(self): self.supp() class Config(object): supp=None @classmethod def initializeConfig(cls): cls.supp=Support() @classmethod def setConfig1(cls): Compute.supp=cls.supp.supportMethod1 @classmethod def setConfig2(cls): Compute.supp=cls.supp.supportMethod2 # adding the __new__ works for this simple demo s = Support(range(10)) assert s.supportMethod1() == Support.supportMethod1(s) assert isinstance(s, Support) assert not isinstance(s.cumsum(), Support) assert not isinstance(s.ix[:5], Support) s = Support(range(10)) df = pd.DataFrame({'s': s}) # df.s is not Support or even the Series. It's the data. assert not isinstance(df.s, Support) assert id(s) != id(df.s) s.ix[0] = 888 # does not change df df import numpy as np s1 = Support(range(10)) s2 = Support(range(10, 20)) stacked = np.vstack((s1, s2)) s.ix[0] = 10 assert stacked[0][0] != s[0] stacked items = {} items['s1'] = 0 items['s2'] = 1 def get_support_series(frame, key): ind = items[key] row = stacked[ind] # box row return Support(row) s2_copy = get_support_series(stacked, 's2') # values are same... assert np.all(s2_copy == s2) # but... assert s2_copy is not s2 s2[0] = 888 assert s2_copy[0] != 888 # they are not the same!