Предположим, у вас есть класс с именем X
, который имеет все дополнительные методы, которые вы хотите реализовать поверх DataFrame
, который выглядит примерно так:
class X(object):
def __init__(self, df):
self._df = df
def unstack(self):
return 'X.untrack called!'
Вы можете создать оболочку вокруг DataFrame
вот так:
class DataFrameWrapper(object):
def __init__(self, *args, **kwargs):
self._dataframe = pd.DataFrame(*args, **kwargs)
self._delegate = X(self._dataframe)
def __getattr__(self, attr):
if attr == 'x':
return self._delegate
return getattr(self._dataframe, attr)
dfw = DataFrameWrapper([1, 2, 3, 4, 5])
print(dfw.unstack()) # Normal unstack() output
print(dfw.x.unstack()) # X.untrack called!
Вы также можете использовать setattr
для установки атрибута x
в вашем DataFrame
экземпляре для ссылки на экземпляр вашего объекта делегата.
df = pd.DataFrame([1, 2, 3, 4, 5])
setattr(df, 'x', X())
print(df.unstack()) # Normal unstack() output
print(df.x.unstack()) # X.untrack called!
РЕДАКТИРОВАТЬ: Передал фрейм данных в оболочке в конструктор X
.