2010-10-11 3 views
1

У меня есть код для класса Range, как это:Python Range Class/Подкласс

class Range: 
    def __init__(self, start, end): 
     self.setStart(start) 
     self.setEnd(end) 
    def getStart(self): 
     return self.start 
    def setStart(self, s): 
     self.start = s 
    def getEnd(self): 
     return self.end 
    def setEnd(self, e): 
     self.end = e 
    def getLength(self): 
     return len(range(self.start, self.end)) 
    def overlaps(self, r): 
     if (r.getStart() < self.getEnd() and r.getEnd() >= self.getEnd()) or \ 
     (self.getStart() < r.getEnd() and self.getEnd() >= r.getEnd()) or \ 
     (self.getStart() >= r.getStart() and self.getEnd() <= r.getEnd()) or \ 
     (r.getStart() >= self.getStart() and r.getEnd() <= self.getEnd()): 
      return True 
     else: 
      return False 

Моя задача заключается в создании подкласса Range, названный DNAFeature, который представляет собой диапазон, который также имеет цепь и последовательность имя:

Реализовать setStrand и getStrand, которые устанавливают и возврат нити информации и setSeqName и getSeqName, которые устанавливают или вернуть имя последовательности функция принадлежит. Если функция находится на минусовой (обратной) линии, getStrand() должен возвращать -1. Если функция указана на плюсовой цепочке, getStrand() должен вернуть 1. Если нить не установлена, getStrand() должен вернуть 0.

Я попытался написать что-то, но не выглядит правильным для меня, я с этим, спасибо так много парней, это мой код:

class DNAFeature(Range): 
    def __init__(self, strand, sequence): 
      self.setStrand(strand) 
      self.setSeqName(sequence) 
    def getSeqName(self): 
      return self.plus or minus 
    def setSeqName(self, seq): 
      self.sequence = seq 
    def getStrand(self): 
      if self.getSeqName(self.strand) == 'plus': 
        return 1 
      if self.getSeqName(self.strand) == 'minus': 
        return -1 
      else: 
        return 0 
    def setStrand(self, strand): 
      self.strand = strand 
+0

Что значит «не так»? Вы запустили его? вы получаете сообщения об ошибках? Какое поведение показывает, что вы не хотите? Предположительно, вы находитесь в программирующем классе, а не в художественном классе. – aaronasterling

+4

Избавьтесь от тех геттеров и сеттеров. Python - это не Java. Даже если вам когда-нибудь понадобится добавить некоторую реальную логику в 'some_range.end = ...', вы можете сделать это через свойства без нарушения кода. – delnan

+0

@Aaron: я импортирую его, но не смог из-за неправильных кодов в seq == POSITIVE, я просто не знаю, как настроить getStrand на ответ, так как функция strand является postive, она возвращает 1, поскольку функция strand is минус, он возвращает -1, и без каких-либо параметров возвращает 0. Как 0: – pmt0512

ответ

0

В самом общем случае (без внесения каких-либо предположений), кажется, что это то, что вам нужно:

class DNAFeature(Range): 

    def __init__(self, start, end): 
     self.setStart(start) 
     self.setEnd(end) 
     self.strand = None 
     self.sequencename = None 

    def setStrand(self, s): 
     self.strand = s 

    def getStrand(self): 
     if self.sequenceName == 'plus': 
      return 1 
     elif self.sequenceName == 'minus': 
      return -1 
     else: 
      return 0 

    def setSequenceName(self, s): 
     self.sequencename = s 

    def getSequenceName(self, s): 
     return self.sequenceName 

Вы заметите, что здесь, я пересмотрел инициализации. Для этого есть причина. Я помню, что в одном из ваших предыдущих вопросов вы упоминали, что это назначение Java, просто переименованное в python. В Java конструкторы не наследуются (исправьте меня, если я ошибаюсь). Поэтому, если используется одна и та же градиентная рубрика, вы потеряете отметки, чтобы не переопределять конструктор здесь.

Надеюсь, что это поможет

+0

oh нет, это полностью python, а не Java, может быть, я ошибся, сказав вам, что это был Java в прошлый раз, извините за это, и большое спасибо за коды, действительно получайте тяжелое время w/getters и seters – pmt0512

+0

Что я имею в виду заключается в том, что ваш профессор скопировал это задание с предыдущих лет, когда это было назначение Java. Я знаю, что это назначение python. Следовательно, почему я дал вам код python – inspectorG4dget

3

в целом гораздо легче ответить на вопросы, если вы предоставите конкретное сообщение об ошибке или вещь, что происходит неправильно. Вот что произошло, когда я попытался запустить выше:

  • Первый:

    `SyntaxError: invalid syntax` 
    

    на if seq == POSITIVE. Что здесь не так? О да, вам не хватает двоеточия после условного. Если вы добавите, что файл, по крайней мере, анализирует. Так давайте попробуем делать некоторые кодирования:

    # Your code here, then: 
    feature = DNAFeature() 
    
  • Бег, что дает:

    TypeError: __init__() takes exactly 3 positional arguments (1 given) 
    

    О, хорошо, мы должны передать некоторые аргументы инициализатора из DNAFeature. Давайте поставим это на + цепи, и называют его Foo:

    feature = DNAFeature(1, "foo") 
    
  • Теперь мы получаем:

    AttributeError: 'DNAFeature' object has no attribute 'setStrand' 
    

    Что это значит? Хорошо, вы не определили setStrand. (Примечание: вы не должны Но об этом позже.). Давайте определим его:

    def setStrand(self, strand): 
        self.strand = strand 
    

Я не хочу, чтобы пройти через остальные проблемы с кодом (подсказка: вам нужно определить переменные перед их использованием), но это именно то, что вы должны делать.


Право, что-то другое. Вышеупомянутый код плохой. Надеюсь, вы написали класс Range и что он не был предоставлен как часть курса, потому что, если у вас есть курс с плохо обученным курсом. Основная проблема заключается в использовании геттеров и сеттеров - я предполагаю, что вы рождены и размножены на Java? В Python вам не нужно писать геттеры и сеттеры для всего, потому что вы всегда можете добавить их позже, если они вам понадобятся. Вместо этого просто используйте атрибуты класса.Посмотрите на следующий код для Range:

class Range: 
    def __init__(self, start, end): 
     self.start = start 
     self.end = end 

    def length(self): 
     return self.end - self.start 

    def overlaps(self, other): 
     return not(self.end < other.start or other.end < self.start) 

не намного лучше? Нет более неприятных аксессуаров, никаких нечетких сравнений в методе overlaps ... Это помогает, если вы выработаете логику, которую ваш код пытается реализовать до того, как вы ее реализуете.

Посмотрите, сможете ли вы лучше написать DNAFeature.


Вы еще не сказали мне, что getStrand должны делать, но вот что я думаю, что вы стремитесь в сторону. Предположим, что имя нити, которое перешло в __init__, имеет форму "+name" или "-name". Затем вы можете сделать следующее:

def __init__(self, strand): 
    sequence = strand[0] #first character of strand 

    if sequence == "+": 
     self.strand = 1 
     self.sequence= strand[1:] 
    elif sequence == "-": 
     self.strand = -1 
     self.sequence = strand[1:] 
    else: 
     self.strand = 0 
     self.sequence = strand 

Посмотрите, сможете ли вы это решить.

+0

На самом деле, класс Range был из предыдущего задания, и мой профессор потребовал, чтобы я вводил сеттеры и геттеры, вот почему я его там, и я запустил класс Range, который тоже работал, в этом назначении, мой профессор спрашивает нас для ввода этого подкласса для Range, который является DNAFeature, для считывания функции цепочки ДНК, как если бы она была плюсовой или минусовой нитью и возвращалась 1, -1 или 0, если нет настройки. – pmt0512

+0

Прошу прощения, но о функции = DNAFeature (1, "foo") где вы положили эту строку, находится ли она под функцией getStrand, прежде чем я определяю seq == POSITIVE? – pmt0512

+3

@pmt: Ваш профессор не знает Python. Правильная идиома - использовать атрибуты класса с дескрипторами данных (http://docs.python.org/reference/datamodel.html#descriptors), такие как 'property', используемые, когда вы хотите выполнять вычисления при доступе к атрибуту. Getters и seters никогда не будут правильным инструментом. Я не совсем понимаю ваш вопрос, но я думаю, вы спрашиваете, как установить атрибут, который равен -1, 0 или 1. Просто установите его! 'self.strand = -1', скажем. Строка 'feature = DNAFeature (1," foo ")' прошла в нижней части программы. – katrielalex