2010-10-11 4 views
1

J'ai code pour une classe de gamme comme celui-ci:Python Range Classe/Sous

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 

Ma mission est de créer une sous-classe de gamme, appelée DNAFeature, qui représente une plage qui a aussi un brin et une séquence nom:

Mettre en oeuvre setStrand et getStrand, qui fixe et de retour d'informations brin, et setSeqName et getSeqName, qui fixe ou renvoyer le nom de la séquence de la fonction appartient. Si une entité est sur le brin négatif (inverse), getStrand() doit renvoyer -1. Si une fonctionnalité est sur le brin plus, getStrand() doit renvoyer 1. Si le brin n'est pas défini, getStrand() doit renvoyer 0.

J'ai essayé d'écrire quelque chose mais ne me semble pas correct, tout le monde peut aider s'il vous plaît moi avec cela, je vous remercie les gars tellement, voici mon code:

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

Que voulez-vous dire que ça ne «regarde» pas? L'avez-vous exécuté? Avez-vous des messages d'erreur? Quel comportement montre-t-il que vous ne voulez pas? Vraisemblablement, vous êtes dans une classe de programmation et pas une classe d'art. – aaronasterling

+4

Débarrassez-vous de ces getters et setters. Python n'est pas Java. Même si vous avez besoin d'ajouter de la vraie logique à 'some_range.end = ...', vous pouvez le faire via les propriétés sans casser le code. – delnan

+0

@Aaron: Je l'ai importé mais je ne pouvais pas en raison des codes incorrects à seq == POSITIVE, je ne sais pas comment définir le getStrand à la réponse car le brin est positif, il retourne 1, comme brin caractéristique est négatif, il renvoie -1, et sans aucun paramètre, renvoie 0. Merci – pmt0512

Répondre

0

Dans le cas le plus générique (sans faire aucune hypothèse), il semble que ce soit ce dont vous avez besoin:

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 

Vous remarquerez que ici, je l'ai redéfini d'initialisation. Il y a une raison pour cela. Je me souviens que dans l'une de vos questions précédentes, vous aviez mentionné qu'il s'agissait d'une tâche Java, simplement renommée en python. En Java, les constructeurs ne sont pas hérités (corrigez-moi si je me trompe). Par conséquent, si la même rubrique de notation est utilisée, vous perdrez des points pour ne pas avoir redéfini le constructeur ici.

Espérons que cela aide

+0

oh non c'est totalement python, pas Java, peut-être que j'ai fait une erreur en vous disant que c'était Java la dernière fois, désolé, et merci beaucoup pour les codes, vraiment mal avec les getters et setters – pmt0512

+0

C'est que votre professeur a copié cette mission des années précédentes quand c'était une tâche Java. Je suis conscient qu'il s'agit d'une affectation python. D'où la raison pour laquelle je vous ai donné du code python – inspectorG4dget

3

en général, il est beaucoup plus facile de répondre à des questions si vous fournissez un message d'erreur spécifique ou une chose qui va mal. Voici ce qui est arrivé quand j'ai essayé de courir ce qui précède:

  • Première place:

    `SyntaxError: invalid syntax` 
    

    sur if seq == POSITIVE. Quel est le problème ici? Oh oui, il te manque un colon après le conditionnel. Si vous ajoutez que le fichier analyse au moins. Donc, nous allons essayer de faire quelques codage:

    # Your code here, then: 
    feature = DNAFeature() 
    
  • course qui donne:

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

    Oh, OK, nous avons besoin de passer des arguments à l'initialiseur de DNAFeature. Mettons cela sur le brin +, et l'appeler foo:

    feature = DNAFeature(1, "foo") 
    
  • Maintenant, nous obtenons:

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

    Qu'est-ce qui se passe? OK, vous n'avez pas défini setStrand. (Remarque: vous ne devriez pas avoir à Mais plus sur cela plus tard.). Définissons-le:

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

Je ne veux pas passer par le reste des problèmes avec le code (indice: vous devez définir des variables avant de les utiliser), mais c'est le genre de chose que vous devriez faire.


À droite, quelque chose de différent. Ce qui précède est de mauvais code. J'espère que vous avez écrit la classe Range et qu'elle n'a pas été fournie dans le cadre du cours, parce que si vous suivez un cours mal enseigné. Le principal problème est l'utilisation de getters et setters - je suppose que vous êtes nés et nés de Java? En Python, vous n'avez pas besoin d'écrire des getters et setters pour tout, parce que vous pouvez toujours les ajouter plus tard si vous en avez besoin. Au lieu de cela, utilisez simplement les attributs de classe.Regardez le code suivant pour 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) 

est-ce pas beaucoup plus agréable? Plus d'accès désagréables, plus de comparaisons icky dans la méthode overlaps ... Cela aide si vous développez la logique que votre code essaie d'implémenter avant de l'implémenter.

Voyez si vous pouvez écrire un meilleur DNAFeature maintenant.


Vous avez toujours pas me dit ce que getStrand devrait, faire, mais voici ce que je pense que vous visez vers. Supposons que le nom du brin qui est passé à __init__ soit de la forme "+name" ou. Vous pouvez ensuite effectuer les opérations suivantes:

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 

Voir si vous pouvez trouver comment cela fonctionne.

+0

En fait, la classe Range provenait d'une affectation précédente et mon professeur m'a demandé d'entrer des setters et des getters, c'est pourquoi je l'avais là, et j'ai couru la classe Range qui fonctionnait aussi, dans cette affectation, mon professeur nous demande pour entrer cette sous-classe pour Range qui est la fonction DNA pour lire la caractéristique brin d'ADN comme si c'est un brin plus ou moins et retourner 1, -1, ou 0 si aucun réglage. – pmt0512

+0

Je suis désolé mais à propos de feature = DNAFeature (1, "foo") où avez-vous mis cette ligne, est-ce sous la fonction getStrand, juste avant que je ne définisse seq == POSITIVE? – pmt0512

+3

@pmt: Votre professeur ne connaît pas Python. L'idiome correct est d'utiliser des attributs de classe, avec des descripteurs de données (http://docs.python.org/reference/datamodel.html#descriptors) tels que 'property', lorsque vous voulez effectuer des calculs lors de l'accès à un attribut. Les getters et les setters ne sont jamais le bon outil. Je ne comprends pas entièrement votre question, mais je pense que vous demandez comment définir un attribut qui est soit -1, 0 ou 1. Il suffit de le définir! 'self.strand = -1', disons. La ligne 'feature = DNAFeature (1," foo ")' est passée en bas du programme. – katrielalex