This allows for class methods to be called statically
without the need for workaround abuse as described in
the python FAQ (or any other method involving grabbing
the "im_func" member from an unbound method object).
This patch changes the "call_method" function in
ceval.c. It removes the improper 'class type
enforcement' on unbound method objects and just passes
the arguments as is.
This allows for natural and clean static methods
inside classes.
The only thing potentially broken with this patch is a
looser guarantee that the "self" value for a method
would be some inherited type instance. This is far
less 'dangerous for abuse' than other python class
designs (no private members, etc).
With this the static method example in the FAQ is much
more cleanly realized. notice, no "self" member for
static methods...
class C:
count = 0
def __init__(self):
C.count += 1
def getcount():
return C.count
def sum(x, y):
return x + y
C(); C()
c = C()
print C.getcount() # prints 3
print c.getcount() # prints 3
print C.sum(27, 15) # prints 42
|