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 - [email protected]
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor