In article <[EMAIL PROTECTED]>, Bruno Desthuilliers <[EMAIL PROTECTED]> wrote:
> Steven D'Aprano a écrit : > > On Mon, 26 Nov 2007 21:48:36 +0100, Ton van Vliet wrote: > > > >> On Mon, 26 Nov 2007 20:14:50 +0100, Bruno Desthuilliers > >> <[EMAIL PROTECTED]> wrote: > >> > >>>> However, I was more thinking in terms of attributes only > >>> Too bad : in Python, everything's an object, so 'methods' are attributes > >>> too. > >> Right, but I'm sure *you* know a way to distinguish between them > > Yes : reading the doc. But that's something the compiler will have hard > time doing. > > >> (I'm > >> just a beginner ;-) > > > > All methods are attributes. Not all attributes are methods. The usual way > > to see if something is a method is to try calling it and see what > > happens, but if you want a less informal test, try type(): > > > > > >>>> type(''.join) > > <type 'builtin_function_or_method'> > >>>> type(Foo().foo) # with the obvious definition of Foo > > <type 'instancemethod'> > > > > > Fine. Now since Python let you define your own callable types and your > own descriptors, you can as well have an attribute that behave just like > a method without being an instance of any of the method types - so the > above test defeats duck typing. And since you can have callable > attributes that are definitively not methods, you can't rely on the fact > that an attribute is callable neither. If you want to have a little fun: class peverse: def __call__(self): raise AttributeError ("peverse instance has no __call__ method") x = peverse() x()
-- http://mail.python.org/mailman/listinfo/python-list