首页 > 解决方案 > 设计这个轨迹类的最佳方法

问题描述

背景:大家好,看到这个问题的人。我是一个 Python 编码初学者(2 周的时间很长!),我相信我最初设计的课程很糟糕,并且正在寻求帮助,以重新设计基础课程(在 Locus.py 中)。

背景:到目前为止,该项目有 4 个类,可以在这里找到 ( https://github.com/asriley/HalfSiblings )。非常基类Locus有一个元组来表示遗传数据的等位基因 (a,b)。下一类,Individual有一个等位基因列表:[(a,b),(c,d),(a,e),(f,d)]。但总的来说,我们有 n 个个体和每个个体的 l 个基因座。

样本数据:7 个人(行)与 3 位点(列)

1,1 5,3 4,3
1,2 4,7 3,7
2,3 3,6 5,4
2,4 7,4 4,9
3,6 8,9 3,0
6,5 4,8 0,0
7,7 7,7 7,9

我试图弄清楚如何设计这个类以将其合并到其他类(特别是个人)中,因为最终我必须使用 networkx 在数据上构建图表。

给出了 Locus 类的完整片段和当前错误:

class Locus:
    # constructor
    def __init__(self):
        self.alleles = ()
    def get_alleles(self):
        return self._alleles    
    def set_alleles (self,x, y):
        if x and y:
            self._alleles = (x,y)
    alleles = property (get_alleles, set_alleles)

l1 = Locus()
l1.set_alleles(1,2)
l1.set_alleles(2,3)
print (l1.get_alleles()) 

Traceback (most recent call last):
  File "Locus.py", line 13, in <module>
  l1 = Locus()
  File "Locus.py", line 4, in __init__
  self.alleles = ()
TypeError: set_alleles() missing 1 required positional argument: 'y'

谁能帮助我应该如何正确处理这门课?

文件解析是在 github 链接中的其他类之一中完成的。所以这不是问题。最终,我想向其他类发送一个 2D 个体列表(包含基因位点信息)。

标签: pythonoop

解决方案


我看到您想使用 @property 装饰器在 Locus 类上获取/设置元组,这是一种可能的方法:

class Locus:

    @property
    def alleles(self):
        return self._alleles

    @alleles.setter
    def alleles(self, value):
        try:
            x, y = value

            # ... Tuple processing goes here ...

            self._alleles = (x, y)
        except ValueError:
            raise ValueError("(x,y) tuple expected")


l1 = Locus()
l1.alleles = (1, 2)
l1.alleles = (2, 3)
print(l1.alleles)

推荐阅读