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

Reply via email to