Please look at the program below as well as my understanding of how it flows and correct me if I'M wrong. Thanks

The first line in main - crit = Critter("Poochie"), creates an object with the string "Poochie" and autmoatically calls __init__, printing "A new critter has been born!"

__init__ creates a private attribute name?

The second line in main crit.talk() and prints Hi, I'm, self.name ("Poochie"), which it is able to get because get_name method?

print cirt.name prints "Poochie", again using the get_method?

# Property Critter
# Demonstrates get and set methods and properties

class Critter(object):
    """A virtual pet"""
    def __init__(self, name):
        print "A new critter has been born!"
        
        self.__name = name
        
        
    def get_name(self): #---------------------------------------reads a value to a private name?
        return self.__name
    
    
    def set_name(self, new_name): #-----------------------------set's a value to a private name?
        if new_name == "":
            print "A critter's name can't be the empty string."
        else:
            self.__name = new_name
            print "Name change successful."
            
    name = property(get_name, set_name) #----------------------allows access through dot notaion
    
    
    def talk(self):
        print "\nHi, I'm", self.name
        
        
# main

crit = Critter("Poochie")
crit.talk()

print "\nMy critter's name is:",
print crit.name

print "\nAttempting to change my critter's name."
crit.name = ""

print "\nAttempting to change my critter's name again."
crit.name = "Randolph"

crit.talk()

raw_input("\n\nPress the enter key to exit.")

well you're almost right :)

__init__ creates a private attribute name?

The second line in main crit.talk() and prints Hi, I'm, self.name ("Poochie"), which it is able to get because get_name method?

print cirt.name prints "Poochie", again using the get_method?

(1)yes in this case, but if omit the underscores in the beginning and write it like this self.name = name, then self.name is not private anymore.
(2) self.__name is private to the outside world but you can use it in the class so I think this line doesn't use the get_name() method because you're calling a method which uses the private variable and you're not accessing the private variable directly.
(3) here crit.name uses the get_name method because you're accessing the class variable directly and since it is private it needs a get method.

As you mentioned in your comments name = property(get_name, set_name) allows a direct call to name, i.e. print crit.name calls the get_name method of the class which then returns the correct name .
You can rewrite the whole thing like this:

class Critter(object):
    """A virtual pet"""
    def __init__(self, name):
        print "A new critter has been born!"
 
        self.__name = name
 
 
    def get_name(self): #---------------------------------------reads a value to a private name?
        return self.__name
 
 
    def set_name( self, new_name ): #-----------------------------set's a value to a private name?
        if new_name == "":
            print "A critter's name can't be the empty string."
        else:
            self.__name = new_name
            print "Name change successful."
 
 
    def talk( self ):
        print "\nHi, I'm", self.__name
 
 
# main
 
crit = Critter("Poochie")
crit.talk()
 
print "\nMy critter's name is:",
print crit.get_name()
 
print "\nAttempting to change my critter's name."
crit.set_name( "" )
 
print "\nAttempting to change my critter's name again."
crit.set_name( "Randolph" )
 
crit.talk()

Hope this helps :)

Edited 7 Years Ago by masterofpuppets: n/a

well you're almost right :)

(1)yes in this case, but if omit the underscores in the beginning and write it like this self.name = name, then self.name is not private anymore.
(2) self.__name is private to the outside world but you can use it in the class so I think this line doesn't use the get_name() method because you're calling a method which uses the private variable and you're not accessing the private variable directly.
(3) here crit.name uses the get_name method because you're accessing the class variable directly and since it is private it needs a get method.

As you mentioned in your comments name = property(get_name, set_name) allows a direct call to name, i.e. print crit.name calls the get_name method of the class which then returns the correct name .
You can rewrite the whole thing like this:

class Critter(object):
    """A virtual pet"""
    def __init__(self, name):
        print "A new critter has been born!"
 
        self.__name = name
 
 
    def get_name(self): #---------------------------------------reads a value to a private name?
        return self.__name
 
 
    def set_name( self, new_name ): #-----------------------------set's a value to a private name?
        if new_name == "":
            print "A critter's name can't be the empty string."
        else:
            self.__name = new_name
            print "Name change successful."
 
 
    def talk( self ):
        print "\nHi, I'm", self.__name
 
 
# main
 
crit = Critter("Poochie")
crit.talk()
 
print "\nMy critter's name is:",
print crit.get_name()
 
print "\nAttempting to change my critter's name."
crit.set_name( "" )
 
print "\nAttempting to change my critter's name again."
crit.set_name( "Randolph" )
 
crit.talk()

Hope this helps :)

Thanks for clearing that up for me. To be totaly honest, though I am vagely understanidng all this, it's very confusing. I'M just working my way through a Python book. Is there any hope for me to learn the skill of programming? Thanks again.

This article has been dead for over six months. Start a new discussion instead.