Jim Byrnes wrote:
I'm trying to teach myself OOP in python (again). The following code
from Dawson's book runs fine, unaltered [1].
What's Dawson's book?
class Critter(object):
""" A virtual pet """
def __init__(self, name):
print "A new critter is born"
self.name = name
def get_name(self):
return self.__name
def set_name(self, new_name):
if new_name == "":
print "A critters name cant be the empty string"
else:
self.__name = new_name
print "Name change successful"
name = property(get_name, set_name) #[1]
This defines a read/write property. You can read it, and write to it.
# name = property(get_name) #[2]
This, uncommented out, defines a read-only property. You can't write to it.
#different_name = property(get_name) #[3]
Uncommented out, this defines a read-only property, but you don't get
any errors because nowhere in your code do you try to write to it.
def talk(self):
print "Hi. I'm", self.name
If I change [1] to [2] I get:
Traceback (most recent call last):
File "propertycritter.py", line 26, in <module>
crit = Critter("Poochie")
File "propertycritter.py", line 7, in __init__
self.name = name
AttributeError: can't set attribute
That's because you're trying to write to a read-only property inside the
__init__ method with the line "self.name = name".
If I change [1] to [3] the program runs with no errors.
Until you do this:
crit = Critter("Poochie")
crit.different_name = "Itchy"
and then you will see the same error.
The property function takes at least one, and at most four, arguments:
name = property(getter, setter, deleter, docstring)
"getter" must be a method that tells the class what to do when the
caller *reads* the attribute with "instance.name".
If present, "setter" must be a method that tells the class what to do
when the caller *writes* the attribute with "instance.name = value". If
there is no setter, you can't write to the attribute.
If present, "deleter" must be a method that tells the class what to do
when the caller *deletes* the attribute with "del instance.name". If
there's no deleter, you can't delete the attribute.
And finally, "docstring", if present, needs to be a text string which is
used, well, it's never actually used anywhere, but you can find it if
you look for it. It's just a message to anyone reading it. docstring is
short for "documentation string".
--
Steven
_______________________________________________
Tutor maillist - Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor