我正在尝试为正在构建的python类动态设置资源文件。解决这个问题的想法是,首先将变量设置为None
,然后使用模块级函数进行分配。我的模块是什么样的:
# my_module
df = None
def set_data(fp, sheet_name, index_col=[0, 1]):
# what I really want to do:
df = pd.read_excel(rf'{fp}', index_col=index_col)
# minimal example:
df = 'Foo'
class DataSet():
def __init__(self):
self.df = df
这是测试时得到的结果。我在这里想念什么?
>>> import my_module
>>> my_module.df == None
True
>>> my_module.set_data('file.xlsx', 'sheet_1')
>>> my_module.df == None
True
>>> my_module.df == 'Foo'
False
答案 0 :(得分:3)
更规范的形式是:
def set_data(fp, sheet_name, index_col=[0, 1]):
# what I really want to do:
return pd.read_excel(rf'{fp}', index_col=index_col)
class DataSet():
def __init__(self, fp, sheet_name, index_col=[0, 1]):
self.df = set_data(fp, sheet_name, index_col)
然后,您只需创建DataSet()
,例如:
>>> dataset = my_module.DataSet('file.xlsx', 'sheet_1')
>>> dataset.df
作为类变量:
class DataSet():
df = None
@classmethod
def set_data(cls, fp, sheet_name, index_col=[0, 1]):
cls.df = pd.read_excel(rf'{fp}', index_col=index_col)
使用:
>>> my_module.DataSet.set_data('file.xlsx', 'sheet_1')
>>> dataset = my_module.DataSet()
>>> dataset.df
您还可以直接从df
访问class
,而无需创建实例:
>>> my_module.DataSet.df