Python Range Class / Подкласс - PullRequest
       4

Python Range Class / Подкласс

1 голос
/ 12 октября 2010

У меня есть код для класса Range, подобный следующему:

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, который представляет Range, который также имеет цепочку и имя последовательности:

Реализация 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

Ответы [ 2 ]

4 голосов
/ 12 октября 2010

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

  • Сначала:

    `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 голосов
/ 17 октября 2010

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

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

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

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

...