我对OOP非常陌生,因此对于经验丰富的OOP人员来说,这个问题可能非常陌生。我有许多文本文件,最长可达2.5亿行,并且我计划根据这些文件列中的值生成报告。这些文件如下所示:
chr1 54071 5 0 8 0
chr1 54072 5 0 9 0
chr1 54073 5 0 9 0
chr1 54074 5 0 9 0
chr1 54075 5 0 9 0
chr1 54076 5 0 9 0
chr1 54077 5 0 9 0
chr1 54078 5 0 9 0
chr1 54079 5 0 10 0
chr1 54080 5 0 10 0
chr1 54081 5 0 10 0
chr1 54082 5 0 10 0
chr1 54083 5 0 10 0
chr1 54084 5 0 10 0
chr1 54085 5 0 11 0
chr1 54086 5 0 11 0
chr1 54087 5 0 11 0
chr1 54088 5 0 11 0
chr1 54089 5 0 12 0
其中col1是染色体,col2是染色体中的一个位置(1-250M),其余cols是样本,每个样本在给定位置的值。
该函数提供2个参数,一个是包含数据的文件,例如上面的示例,另一个是示例列表,例如:[“ AE”,“ BE”,“ HE”,“ C” ],以使其出现在数据文件中。
报告应为每个样本以及样本col的值大于给定值(例如说“ 2”)的每个样本组合生成摘要输出。该报告如下:
Sample BasesCovered FractionOfTotal
AE 43954 0.43954
BE 18728 0.18728
HE 33780 0.3378
C 8108 0.08108
AE:BE 17576 0.17576
AE:HE 28818 0.28818
AE:C 7268 0.07268
BE:HE 13694 0.13694
BE:C 4349 0.04349
HE:C 4827 0.04827
AE:BE:HE 12873 0.12873
AE:BE:C 4263 0.04263
AE:HE:C 4634 0.04634
BE:HE:C 2831 0.02831
AE:BE:HE:C 2750 0.0275
TotalSize 100000 1.00
我已经使用生成器和函数式编程实现了这一点,但是我想学习OOP,所以我试图通过制作一个“报告”对象在OOP中实现这一点,该对象随生成器的每个产量而更新。我用来启动报告的功能代码如下:
def initiate_overlap_dict(SAMPLE_LIST):
# Takes a list or a string and converts it into a dict of all combinations, initiates the value of the dict as integer 0
if len(SAMPLE_LIST)==1 and type(SAMPLE_LIST)==list:
return {SAMPLE_LIST[0]: 0}
elif len(SAMPLE_LIST)==0 and type(SAMPLE_LIST)==list:
raise Exception('"SAMPLE_LIST" needs to contain samples!')
elif type(SAMPLE_LIST) != list:
raise Exception('"SAMPLE_LIST" must be a list of length >=1 in the same order as they appear in the depth_file')
else:
sample_list=[str(x) for x in SAMPLE_LIST]
out={}
for s in sample_list:
out[s]=0
for c in range(2,len(sample_list)+1):
for s in combinations(sample_list,c):
out[':'.join(s)]=0
return out
我只是在程序开始时调用它,然后使用生成器的每个产量对其进行更新。我想对OOP做类似的事情,并尝试了以下方法:
from itertools import combinations
class CoverageReport(object):
# CONSTRUCTOR
def __init__(self, samples):
self.samples = samples # list of samples
self.coverage = self.initiate_overlap_dict(self)
# REPRESENTATION METHOD: WHAT WILL BE PRINTED BY DEFAULT IF THE OBJECT IS CALLED
def __repr__(self):
return '<The following samples are examined for coverage: ' + self.samples +'>'
def initiate_overlap_dict(self):
# Takes a list or a string and converts it into a dict of all combinations, initiates the value of the dict as integer 0
if len(self.samples)==1 and type(self.samples)==list:
return {self.samples[0]: 0}
elif len(self.samples)==0 and type(self.samples)==list:
raise Exception('"SAMPLE_LIST" needs to contain samples!')
elif type(self.samples) != list:
raise Exception('"SAMPLE_LIST" must be a list of length >=1 in the same order as they appear in the depth_file')
else:
sample_list=[str(x) for x in self.samples]
out={}
for s in sample_list:
out[s]=0
for c in range(2,len(sample_list)+1):
for s in combinations(sample_list,c):
out[':'.join(s)]=0
return out
report=CoverageReport(["AE","BE","HE","C"])
基本上,我正在尝试使对象以列表中的每个项目以及项目组合的值为0来初始化自身,以便随后我可以创建将针对生成器的每次迭代进行更新的update方法。它引发以下错误:
TypeError: initiate_overlap_dict() takes 1 positional argument but 2 were given
我认为这与尝试在 init 中启动self.coverage而不是提出创建对象的争论有关-有一种方法可以使用列表(self。样本)?既然这应该是启动空白/未填充报告的全部?
有没有办法做到这一点?我确定即使具有基本的OOP技能的人也可以轻松回答这个问题?我对要搜索的全部内容感到困惑。非常感谢
答案 0 :(得分:1)
您不需要致电self.initiate_overlap_dict(self)
,只需要致电self.initiate_overlap_dict()
。
即删除self
自变量
您可以在这里https://pythontips.com/2013/08/07/the-self-variable-in-python-explained/