Лучший способ создать этот класс Locus

1

Контекст: Привет всем, кто смотрит на этот вопрос. Я начинаю программировать на 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 локусами (cols)

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-список физических лиц (содержащих генетическую информацию Locus) в другие классы.

Теги:
oop
design

1 ответ

0
Лучший ответ

Я вижу, что вы хотите использовать декоратор @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)
  • 1
    когда вы назначаете l1.alleles = whatever , что бы ни было значение. Например, l1.alleles = (1,2) , кортеж (1,2) будет значением. И при выполнении x, y = value вы распаковываете кортеж, если он распакован неправильно, вы получите исключение. Я бы посоветовал вам взглянуть на этот учебник https://www.python-course.eu/python3_properties.php , он достаточно хорошо объясняет основы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню