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