DRY and static attribute for multiple classes.

Michele Simionato michele.simionato at gmail.com
Wed Feb 2 17:58:45 CET 2011


Notice that Peter's approach also works without inheritance:

registries = {}

@property
def per_class(self):
   cls = type(self)
   try:
      return registries[cls]
   except KeyError:
      result = registries[cls] = []
      return result

class A(object): per_class=per_class
class B(object): per_class=per_class
assert A().per_class is A().per_class
assert B().per_class is B().per_class
assert A().per_class is not B().per_class

(you can also put the per_class property in a module and import it
with
class A(object): from module import per_class).

There is no need to use inheritance if you only need one method.
Notice also that if you
are working with a complex third party framework (say Django) that may
use metaclasses
or strange tricks (such as __slots__) the safer way is to avoid both
inheritance and metaclasses.
HTH,

 Michele



More information about the Python-list mailing list