Felipe Almeida Lessa wrote: > Em Dom, 2006-03-19 às 08:54 -0800, Scott David Daniels escreveu: >> class A(object): >> def __new__(class_, *args, **kwargs): >> if class_ is A: >> if want_a_B1(*args, **kwargs): >> return B1(*args, **kwargs) >> elif want_a_B2(*args, **kwargs): >> return B2(*args, **kwargs) >> return object.__new__(class_) # Use *a,... except for object >> >> class B1(A): >> def __new__(class_, *args, **kwargs): >> if class_ is B1: >> if want_a_B1(*args, **kwargs): >> return B1(*args, **kwargs) >> elif want_a_B2(*args, **kwargs): >> return B2(*args, **kwargs) >> return super(B1, class_).__new__(class_, *args, **kwargs) > > Why you have that if on B1.__new__? B1 will be created only by > A.__new__, which already did a check.
Of course your are right. It needs to be more like: class B1(A): def __new__(class_, *args, **kwargs): if class_ is B1: if want_a_C1(*args, **kwargs): return C1(*args, **kwargs) elif want_a_C2(*args, **kwargs): return C1(*args, **kwargs) return super(B1, class_).__new__(class_, *args, **kwargs) --Scott David Daniels [EMAIL PROTECTED] -- http://mail.python.org/mailman/listinfo/python-list