functions, classes, bound, unbound?
Steven Bethard
steven.bethard at gmail.com
Sun Mar 25 00:20:36 EDT 2007
7stud wrote:
> Here is some example code that produces an error:
>
> class Test(object):
> def greet():
> print "Hello"
>
> t = Test()
> t.greet()
> TypeError: greet() takes no arguments (1 given)
[snip]
> Test.greet()
>
> TypeError: unbound method greet() must be called with Test instance as
> first argument (got nothing instead)
Methods in a class are generally expected to take an instance as their
first argument, but your greet() method takes no arguments. This is
because classes don't invoke the function directly, they convert it to
an 'unbound method' object::
>>> class Test(object):
... def greet():
... print 'Hello'
...
>>> Test.greet
<unbound method Test.greet>
>>> Test.greet()
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
TypeError: unbound method greet() must be called with Test instance
as first argument (got nothing instead)
If you really want to get to the original function, there are a couple
of options. You can go through the class's __dict__, or you can wrap
your method with a @staticmethod decorator (which tells the class not to
wrap the function when you try to use it)::
>>> Test.__dict__['greet']
<function greet at 0x00E708B0>
>>> Test.__dict__['greet']()
Hello
>>> class Test(object):
... @staticmethod
... def greet():
... print 'Hello'
...
>>> Test.greet
<function greet at 0x00E7D2F0>
>>> Test.greet()
Hello
STeVe
More information about the Python-list
mailing list