the annoying, verbose self

Roy Smith roy at panix.com
Tue Nov 27 04:20:20 EST 2007


In article <474bdf4f$0$19226$426a74cc at news.free.fr>,
 Bruno Desthuilliers <bruno.42.desthuilliers at wtf.websiteburo.oops.com> 
 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
> >> <bdesth.quelquechose at free.quelquepart.fr> 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()



More information about the Python-list mailing list