Clase de nota de música - v2 -- python campo con music camp codereview Relacionados El problema

Music note class - v2


0
vote

problema

Español

Versión 2 de Clase de nota de música

  #!/usr/bin/env python3  from string import ascii_uppercase from string import ascii_lowercase   class Notes:     octave_number = 7     low_notes = ascii_uppercase[:octave_number]     high_notes = ascii_lowercase[:octave_number]     notes = low_notes + high_notes     notes_number = range(octave_number * 2)     notes_dict = dict(zip(notes, notes_number))     numbers_dict = dict(zip(notes_number, notes))      def __init__(self, _note):         if not _note in Notes.notes:             raise Exception("Not a valid note")         self.note = _note         self.note_number = Notes.notes_dict[self.note]      def add(self, n):         if (self.note in Notes.high_notes) and (n > 0):             raise Exception("You can only add to low notes (ABCDEFG)")         if (self.note in Notes.low_notes) and (n < 0):             raise Exception("You can only subtract from notes (abcdefg)")         if(abs(n) > Notes.octave_number):             raise Exception("Maximum amount of increase or decrease is %d" % Notes.octave_number)           new_number = self.note_number + n         return Notes(Notes.numbers_dict[new_number])   

Prueba:

  x = Notes("A") x.add(7).note x = Notes("b") x.add(-6).note   

cambios:

  • eliminado minus MÉTODO
  • Notas ampliadas a dos octavas
  • add ahora devuelve un objeto Notes
Original en ingles

Version 2 of Music note class

#!/usr/bin/env python3  from string import ascii_uppercase from string import ascii_lowercase   class Notes:     octave_number = 7     low_notes = ascii_uppercase[:octave_number]     high_notes = ascii_lowercase[:octave_number]     notes = low_notes + high_notes     notes_number = range(octave_number * 2)     notes_dict = dict(zip(notes, notes_number))     numbers_dict = dict(zip(notes_number, notes))      def __init__(self, _note):         if not _note in Notes.notes:             raise Exception("Not a valid note")         self.note = _note         self.note_number = Notes.notes_dict[self.note]      def add(self, n):         if (self.note in Notes.high_notes) and (n > 0):             raise Exception("You can only add to low notes (ABCDEFG)")         if (self.note in Notes.low_notes) and (n < 0):             raise Exception("You can only subtract from notes (abcdefg)")         if(abs(n) > Notes.octave_number):             raise Exception("Maximum amount of increase or decrease is %d" % Notes.octave_number)           new_number = self.note_number + n         return Notes(Notes.numbers_dict[new_number]) 

Test:

x = Notes("A") x.add(7).note x = Notes("b") x.add(-6).note 

Changes:

  • Removed minus method
  • Expanded notes to two octaves
  • add now returns a Notes object
     
 
 

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

Debe estar al tanto de los "Métodos Magic Methículos" de Python para implementar comportamientos de clase, incluidos los métodos numéricos como __add__ y __sub__1 . Esto le permite escribir por ejemplo. note3 = note1 + note2 , en lugar de note3 = note1.add(note2) . También hay métodos para mostrar, incluyendo __repr__ , para que pueda ver fácilmente la instancia. Adicionalmente:

  • El nombre de la clase debe ser singular, ya que esto solo tiene una nota, y las constantes deben ser 9988777665544335 ;
  • Es más fácil manejar en mayúsculas o en minúsculas y convertir todas las entradas en consecuencia;
  • Puede acceder a los atributos de la clase a través de self también, lo que facilita la herencia;
  • Usted verifica note en __init__ , pero no hay nada que lo protegerá después; y
  • number9 podría calcularse en función de __sub__0 según sea necesario, en lugar de almacenarse como información duplicada.

Aquí hay una implementación alternativa con esas ideas en.

  __sub__1  

en uso:

  __sub__2  

¡Ahora todo lo que necesita son octavas y accidentales! También debe agregar algo doctras explicando lo que hace la clase y cómo usarlo .

 

You should be aware of Python's "magic methods" to implement class behaviours, including numerical methods like __add__ and __sub__. This allows you to write e.g. note3 = note1 + note2, rather than note3 = note1.add(note2). There are also methods for display, including __repr__, so you can easily view the instance. Additionally:

  • the class name should be singular, as this only holds one note, and constants should be UPPERCASE;
  • it's easier to handle either uppercase or lowercase and convert all input accordingly;
  • you can access class attributes via self too, which makes inheritance easier;
  • you check note in __init__, but there's nothing to protect it afterwards; and
  • number could be calculated based on note as required, rather than stored as duplicate information.

Here's an alternative implementation with those ideas in.

#!/usr/bin/env python3  from string import ascii_uppercase  class Note:      NOTE_COUNT = 7     NUMBERS = dict(enumerate(ascii_uppercase[:NOTE_COUNT]))     NOTES = {v: k for k, v in NUMBERS.items()}      def __init__(self, note=None, number=None):         if note is not None and note.upper() in self.NOTES:             note = note.upper()         elif number is not None and number in self.NUMBERS:             note = self.NUMBERS[number]         else:             raise Exception("Not a valid note")         self._note = note       def __repr__(self):         return "Note({._note!r})".format(self)      @property     def number(self):         return self.NOTES[self._note]      @property     def note(self):         return self._note      @note.setter     def note(self, new_note):         new_note = new_note.upper()         if new_note not in self.NOTES:             raise Exception("Not a valid note")         self._note = new_note      def __add__(self, other):         try:             num = other.number         except AttributeError:             num = other         return Note(number=((self.number+num)%self.NOTE_COUNT))      def __sub__(self, other):         try:             num = other.number         except AttributeError:             num = other         return Note(number=((self.number-num)%self.NOTE_COUNT)) 

In use:

>>> B = Note("B") >>> C = Note("C") >>> B + C Note('D') # not sure this addition makes sense, but it works! >>> B.note = "X" Traceback (most recent call last):   File "<pyshell#38>", line 1, in <module>     B.note = "X"   File "<pyshell#34>", line 30, in note     raise Exception("Not a valid note") Exception: Not a valid note >>> B.number 1 

Now all you need is octaves and accidentals! You should also add some docstrings explaining what the class does and how to use it.

 
 
   
   

Relacionados problema

1  Beat Count-Time Converter (Tarea # 2)  ( Beat count to time converter task 2 ) 
hace aproximadamente un año, me dieron una asignación de C ++ como una prueba preliminar de entrevistas de trabajo. La asignación incluía 4 tareas diferente...

14  Generador de canciones de letra usando cadenas de Markov - Python  ( Song lyric generator using markov chains python ) 
He escrito un generador de canciones pop que utiliza la biblioteca de Markovify para producir letras según (solo para fines de prueba) canciones de Avril Lavi...

2  Reproductor de música de bash simple - Seguimiento  ( Simple bash music player follow up ) 
Esta pregunta es un seguimiento para esta pregunta . Esto es un año después, pero tiene el mismo contexto: quería nuevas revisiones para el código actualiz...

10  Un piano virtual  ( A virtual piano ) 
He creado un piano virtual que convierte el Hogar fila (excluyendo 'g' y 'h') y la fila superior (excluyendo 'y' y 'u') del teclado del usuario en el teclad...

3  Función SWIFT para encontrar un conjunto específico de combinaciones de 3 dígitos dentro de una matriz entera más grande  ( Swift function to find a specific set of combinations of 3 digits within a large ) 
Hice esta pregunta sobre el desbordamiento de la pila y se dirigió aquí. Estoy trabajando en una función que me ayudará a encontrar rápidamente todas las tría...

3  Aplicación MIDI Editor  ( Midi editor application ) 
fuente Hice un proyecto para una clase, un editor MIDI escrito con Java 8 y Swing, y continuó trabajando en él por mi cuenta. Sin embargo, me encontré con...

14  Usando la secuencia Fibonacci para generar melodías musicales  ( Using fibonacci sequence to generate musical melodies ) 
Recientemente comencé a recoger el lenguaje de programación de Haskell. Me las arreglé para aprender otros idiomas con bastante rapidez, pero todavía tengo di...

5  Clase de notas para administrar información sobre varias notas musicales  ( Note class for managing information on various musical notes ) 
Acabo de terminar (RE) leer Código limpio , y una de las ideas que aprendí fue el SRP. Sin embargo, no estoy muy seguro de lo que define una "responsabilidad...

8  Piano, salga todas las llaves y da una escala  ( Piano output all the keys and give a scale ) 
Tengo dos fragmentos de fragmentos de abajo, la primera salida todas las teclas de un piano y el segundo me dan una escala cuando se le administra una nota de...

4  Transposición de notas por un paso completo  ( Transposing notes by one whole step ) 
Actualmente estoy escribiendo una aplicación que convierte las llaves musicales. En pocas palabras, la parte de conversión de la secuencia de comandos, es una...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos