根据提供的论据获取python对象以启动功能

时间:2018-08-16 11:50:04

标签: python oop object

我对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技能的人也可以轻松回答这个问题?我对要搜索的全部内容感到困惑。非常感谢

1 个答案:

答案 0 :(得分:1)

您不需要致电self.initiate_overlap_dict(self),只需要致电self.initiate_overlap_dict()
即删除self自变量
您可以在这里https://pythontips.com/2013/08/07/the-self-variable-in-python-explained/

了解更多信息