Laszlo Zsolt Nagy wrote: > class A(object): > cnt = 0 > a_cnt = 0 > def __init__(self): > A.cnt += 1 > if self.__class__ is A: > A.a_cnt += 1 > class B(A): > pass > print A.cnt,A.a_cnt # 0,0 > b = B() > print A.cnt,A.a_cnt # 1,0 > a = A() > print A.cnt,A.a_cnt # 2,1 > > But then, I may want to create read-only class property that returns the > cnt/a_cnt ratio. > This now cannot be implemented with a metaclass, because the metaclass > cannot operate on the class attributes:
Huh? Every function in the metaclass takes the class object as the first parameter. So they can all operate on the class attributes: py> class A(object): ... cnt = 0 ... a_cnt = 0 ... def __init__(self): ... A.cnt += 1 ... if self.__class__ is A: ... A.a_cnt += 1 ... class __metaclass__(type): ... @property ... def ratio(cls): ... return cls.a_cnt/float(cls.cnt) ... py> class B(A): ... pass ... py> A.cnt, A.a_cnt (0, 0) py> A.ratio Traceback (most recent call last): File "<interactive input>", line 1, in ? File "<interactive input>", line 11, in ratio ZeroDivisionError: float division py> b = B() py> A.cnt, A.a_cnt, A.ratio (1, 0, 0.0) py> a = A() py> A.cnt, A.a_cnt, A.ratio (2, 1, 0.5) STeVe -- http://mail.python.org/mailman/listinfo/python-list