- Use class attributes and methods to write durable and powerful code.
- Store and access song data using class attributes and methods.
- Accomplish complex programming tasks using knowledge from previous modules.
- Attribute: variables that belong to an object.
- Constant: variable whose value cannot be changed.
- Instance: one specific working copy of a class. It is created when a
class's
__init__method is called. - Class: a bundle of data and functionality. Can be copied and modified to accomplish a wide variety of programming tasks.
- Static: an attribute or method that cannot manipulate the class or instance it belongs to.
- Exception: an error that occurs during the execution of a program. Exceptions can be anticipated and handled without disrupting the execution of the program.
In this lab, we'll be dealing with a Song class. The Song class can produce
individual songs. Each song has a name, an artist and a genre. We need our
Song class to be able to keep track of the number of songs that it creates.
Song.count
# => 30We need our Song class to be able to show us all of the artists of existing
songs:
Song.artists
# ["Jay-Z", "Drake", "Beyonce"]We need our Song class to be able to show us all of the genres of existing
songs:
Song.genres
# => ["Rap", "Pop"]We also need our Song class to be able to keep track of the number of songs of
each genre it creates.
In other words, calling:
Song.genre_countShould return something like this;
{"Rap": 5, "Rock": 1, "Country": 3}Lastly, we want our Song class to reveal to us the number of songs each artist
is responsible for.
Song.artist_count
# {"Beyonce": 17, "Jay-Z": 40}We'll accomplish this with the use of class attributes and class methods.
Define your Song class such that an individual song is initialized with a
name, artist and genre.
ninety_nine_problems = Song("99 Problems", "Jay-Z", "Rap")
ninety_nine_problems.name
# "99 Problems"
ninety_nine_problems.artist
# "Jay-Z"
ninety_nine_problems.genre
# "Rap"Create a class attribute, count. We will use this attribute to keep track of
the number of new songs that are created from the Song class. Set this
attribute equal to 0.
At what point should we increment our count of songs? Whenever a new song is
created. Your __init__ method should call a class method
add_song_to_count() that increments the value of count by one.
Next, define the following class methods:
add_to_genres(): adds any new genres to a class attribute genres, a
list. This list should contain only unique genres — no duplicates! Think
about what you'll need to do to get this method working:
- You'll need a class attribute, let's call it
genres, that is equal to an empty list. - When should you add genres to the array? Whenever a new song is created.
Your
__init__method should add the genre of the song being created to thegenreslist. All genres should be added to the list. Control for duplicates when you code youradd_to_genresclass method, not when you add genres to the originalgenreslist. We will want to know how many songs of each genre have been created. We'll revisit that job a little later on.
add_to_artists(): adds any new artists to a class attribute artists, a
list. This list should only contain unique artists, just like the genres
class attribute. Once again, thnk about what you need to do to implement this
behavior:
- You'll need a class attribute,
artists, that is equal to an empty list. - When should you add artists to this array? Whenever a new song is
initialized. Your
__init__method should add artists to theartistslist. All artists should be added to the list. Control for duplicates when you code youradd_to_artists()class method, not when you add artists to the originalartistslist. We will want to know how many songs each have been assigned to each artist. We'll revisit that job a little later on when we write ouradd_to_artist_count()method.
add_to_genre_count(): adds to a class attribute genre_count, a dictionary
in which the keys are the names of each genre. Each genre name key should point
to a value that is the number of songs that have that genre.
Song.genre_count
# {"Rap": 5, "Rock": 1, "Country": 3}This manner of displaying numerical data is called a histogram. How will you create your histogram? There are a few ways!
- You can need to iterate over the
genreslist and populate a dictionary with the key/value pairs. You will need to check to see if the hash already contains a key of a particular genre. If so, increment the value of that key by one, otherwise, create a new key/value pair.
add_to_artist_count(): creates a histogram similar to the one above, but for
artists rather than genres.