Unpythonic? Impossible??
BrJohan
brjohan at gmail.com
Sun Mar 19 13:33:24 EST 2006
"Scott David Daniels" <scott.daniels at acm.org> skrev i meddelandet
news:441d8a74$1 at nntp0.pdx.net...
> BrJohan wrote:
...
>> is it then possible to have this call:
>> obj = A(data)
>> return an instance of that particular class (e.g. class C3) in the
>> hierarchy that - as decided by the __new__ functions - is the 'correct'
>> one?
>>
>> A.__new__ could select between A, B1 and B2, while B1.__new__ could
>> choose from B1, C3 and C4.
>>
>> I know how to use a class factory - and could work around using such a
>> mechanism. However I am interested to know if I could let the classes do
>> the work by themselves.
>
> Yes, it can be done. Yes, it is unclear (and hence UnPythonic).
> The class factory _is_ the straightforward way to do this. The
> following is the workaround (if you have to maintain A(...)):
>
>
> 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)
>
>
> --Scott David Daniels
> scott.daniels at acm.org
Agreed that the class factory method most often (maybe always) is the best
one. For certain reasons, and in this particular case, I prefer the
UnPythonic way. Sometimes it's good to have "more than one way to do it".
It was the "return object.__new__(class_) " that I did not came to think of
myself, that did it. Thank you for yor helpfulness.
BrJohan
More information about the Python-list
mailing list