Am 29.10.2012 00:30, schrieb goldtech:
class Contact:
     all_contacts = []
     def __init__(self, name, email):
         self.name = name
         self.email = email
         Contact.all_contacts.append(self)

Okay, a class that automatically registers all instances in a central list.


OK, no I do this:

c = Contact('aaa','bbb')
c = Contact('ccc','ddd')
c = Contact('eee','fff')
for i in Contact.all_contacts:
        print i.name + '  ' + i.email


aaa  bbb
ccc  ddd
eee  fff

c.name
'eee'

So wouldn't be good to add a check that the var (in this case c) does
not point to any object before creating an object to keep the list
correct?

Since you don't use "c", there is no use storing it at all! Note that you don't have to store a reference to an object that you created, just calling "Contact('fou', 'barre')" without assigning to anything is fine. Note that I don't find this example good, in reality I would prefer a factory method (e.g. called "register(name, email)") that makes clear that you are not simply creating an instance.

Also, concerning OOP, classes in Python are objects, too. Therefore, this could be decorated with "@classmethod" to allow the use with derived classes. However, I think that's going a bit too far at the moment. Just wanted to mention that there are more features waiting for you to discover.


Also all_contacts is a class variable. I think the author is hinting
that this would be a good idea for a contact list, But I don't fully
see the usage of it. How would each object use a class variable like
this? What would be the dot notation?

How would an object use a method defined in the class? The point is that when calling "fou.barre(42)", the expression "fou.barre" is evaluated first and then used in a call expression with the parameter 42. Note that you can even evaluate that expression without calling the resulting function, but instead assign its result to a variable. In order to evaluate that expression, Python first looks for an attribute "barre" in the instance and returns that if found. If the instance doesn't have it, it looks in the class via the instances __class__ attribute. At that point, a little case-specific magic happens. If it finds a normal function without "@classmethod" or "@staticmethod" decorator, it returns this function with the first parameter (customary called "self") bound to the instance. If it finds a non-function, that object is returned as-is instead.

To sum up, you can use "Contact.all_contacts" or e.g. "c.all_contacts" to refer to the list of contacts. The second syntax also includes "self.all_contacts" when inside a memberfunction, after all the "self" is nothing magic or special.

Uli

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to