c james <[EMAIL PROTECTED]> writes: >> class YesNo(object): >> def __init__(self, which): >> self.which = which >> >> def __call__(self, val): >> return (self.no, self.yes)[self.which](val) >> >> def yes(self, val): >> print 'Yes', val >> >> def no(self, val): >> print 'No', val > > Thanks, I was trying to eliminate another level of indirection with a > test at each invocation of __call__
Allowing instance lookup of __call__ would slow down normal uses of the internal __call__ mechanism. Since it used for all function and method calls, it needs to remain extremely fast. If you're really worried about performance, you can define YesNo.__new__ to return either a Yes instance or a No instance, depending on the value: class YesNo(object): def __new__(cls, which): if which: return object.__new__(Yes) else: return object.__new__(No) def yes(self, val): print 'Yes', val def no(self, val): print 'No', val class Yes(YesNo): def __call__(self, val): self.yes(val) # no check at every call class No(YesNo): def __call__(self, val): self.no(val) # likewise >>> x = YesNo(True) >>> x <__main__.Yes object at 0xb7d0ee8c> >>> x('foo') Yes foo >>> y = YesNo(False) >>> y <__main__.No object at 0xb7d0eeec> >>> y('foo') No foo >>> isinstance(x, YesNo) True >>> isinstance(y, YesNo) True -- http://mail.python.org/mailman/listinfo/python-list