Hi, I am teaching myself Python with the book :Python Programming for the Absolute Beginner, 3rd edition by M Dawson. It is an excellent book and I am enjoying completing the challenges at the end of each chapter. There are, unfortunately, no answers nor examples of good and bad code. Honestly I don’t want to “cheat” but I have to teach Python to some young students in September, using this book, and I want all the responses to any doubts they have ready ..... Here’s something specific: chapter 8 challenge 2: “ Write a program that simulates a television by creating it as an object. The user should be able to enter a channel number and raise or lower the volume. Make sure that the channel number and volume level stay within valid ranges.”
I have done a little programming in BlueJ Java before but I decided to try the “Python style” as explained in the chapter, using properties rather than variables and getters and setters ..... My main question is: When using property and setter it seems I must use “__name” or “__volume” (Python’s version of private variables). Is this true? Here are parts of my code: - any comments about how bad / good this code is for the level in the book (NOT advanced stuff please) would be greatly appreciated. Thank you class Television(object): #Contstructor def __init__(self, name, channel = 1, volume = 5): print("A television has been made!") #As I am using properties these assignments indirectly call the #relevant property setter methods listed below self.name = name self.channel = channel self.volume = volume #Note: "self.__name = name" works but then no call is made to the property setter method @property def name(self): return self.__name @name.setter def name(self, newName): if newName != "": self.__name = newName print("This TV is now called: ", self.__name) else: print("Sorry, empty string not allowed as a name.") #If the setter was called in the middle of the program run #that is it already has an attribute self.__name with a value #So leave the namae as it was, unchanged. try: print("The name stays as: ", self.__name) #This will generate an attribute error when called as part of the __init__ #because self.name has not yet been created nor assigned. #So catch this error and give self.__name a "default name" except AttributeError: self.__name = "Default" print("The TV is now called: ", self.__name) and ............ def main(): tv_name = input("What do you want to call your television? ") tv = Television(tv_name) choice = None while choice != "0": print \ (""" TV Maker 0 - Quit 1 - Television Details 2 - Set Channel 3 - Set Volume 4 - Chanage the name of the TV """) choice = input("Choice: ") print() # exit if choice == "0": print("Good-bye.") # Print details of television elif choice == "1": print("Television details.") print(tv) # Change the channel elif choice == "2": amount = int(input("Enter 1 to 100 to choose a channel. ")) tv.channel = amount # Change the volume elif choice == "3": amount = int(input("Enter 0 to 10 set the volume. ")) tv.volume = amount elif choice == "4": print("Choose a new name for your television but not nothing!") tv.name = input("Enter a new name here: ") # some unknown choice else: print("\nSorry, but", choice, "isn't a valid choice.") _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor