C Gillespie a écrit :
Hi,
Does anyone know of any examples on how (& where) to use staticmethods and
classmethods?
Here's an example from a ldap lib (work in progress, not finished, and
all other disclaimers).
The class methods are here:
# ----------------------------------------------------------------------
# Base class for LDAP Objects
# ----------------------------------------------------------------------
class LdapObject(obje ct):
"""
Base class for LDAP data objects.
"""
(snip)
# ------------------------------------------------------------------
def query_class(cls ):
return "(objectClass=% s)" % cls.query_objec t_class
query_class = classmethod(que ry_class)
# ------------------------------------------------------------------
def query_id(cls, ldap_id):
return "(& %s (%s=%s))" % (cls.query_clas s(), cls.id_attribut e,
ldap_id)
query_id = classmethod(que ry_id)
# ------------------------------------------------------------------
def query(cls, filters=None):
if filters is None:
return cls.query_class ()
else:
return cls._decorate_q uery(filters(cl s))
query = classmethod(que ry)
# ------------------------------------------------------------------
def _decorate_query (cls, query):
return "(& %s %s)" % (cls.query_clas s(), query)
_decorate_query = classmethod(_de corate_query)
class LdapContact(Lda pObject):
"""
Wraps a MozillaAbPerson Obsolete/OpenLDAPperson entry.
"""
# ldap objectClass(es)
object_classes =('OpenLDAPpers on',
'MozillaAbPerso nObsolete', )
# which one we'll use for queries
query_object_cl ass = 'MozillaAbPerso nObsolete'
id_attribute = 'uid'
sort_keys = ('displayName', )
(snip)
They are used here (LdapItemKlass is supposed to be a subclass of
LdapObject, like LdapContact above):
# ----------------------------------------------------------------------
# The LdapConnection itself.
# ----------------------------------------------------------------------
class LdapConnection( object):
(snip)
# ------------------------------------------------------------------
def list_items(self , ldapItemKlass, sort_keys=None,
filters=None):
items = [ldapItemKlass(s elf, entry) \
for entry in self._search( \
ldapItemKlass.q uery(filters, match_op) \
)]
if sort_keys is None:
sort_keys = ldapItemKlass.s ort_keys
return self.sort(items , sort_keys)
# ------------------------------------------------------------------
def get_item(self, ldapItemKlass, ldap_id):
entry = self._get_item( ldapItemKlass, ldap_id)
if entry is not None:
entry = ldapItemKlass(s elf, entry)
return entry
(snip)
And client code may look like this (LdapContact being a subclass of
LdapObject):
cnx = LdapConnection( ...).connect()
all_contacts = cnx.list_items( LdapContact)
someone = cnx.get_item(Ld apContact, 'uid=someone')
Since we don't have any instance before running the query, we can't use
instance methods... Still, most of the knowledge required to build the
appropriate query belongs to the LdapContact (or whatever) class.
HTH
Bruno