Using my routines as functions AND methods

Thomas Passin list1 at tompassin.net
Thu Jan 4 00:11:16 EST 2024


On 1/3/2024 11:17 PM, Thomas Passin wrote:
> On 1/3/2024 8:00 PM, Alan Gauld via Python-list wrote:
>> On 03/01/2024 22:47, Guenther Sohler via Python-list wrote:
>>> Hi,
>>>
>>> In my cpython i have written quite some functions to modify "objects".
>>> and their python syntax is e.g.\
>>>
>>> translate(obj, vec). e.g whereas obj is ALWAYS first argument.
>>
>>> However, I also want to use these functions as class methods without 
>>> having
>>> to
>>> write the function , twice. When using the SAME function as a methos, 
>>> the
>>> args tuple must insert/contain "self" in the first location, so i have
>>> written a function to do that:
>>
>> I'm probably missing something obvious here but can't you
>> just assign your function to a class member?
>>
>> def myFunction(obj, ...): ...
>>
>> class MyClass:
>>      myMethod = myFunction
>>
>>
>> Then you can call it as
>>
>> myObject = MyClass()
>> myObject.myMethod()
>>
>> A naive example seems to work but I haven't tried anything
>> complex so there is probably a catch. But sometimes the simple
>> things just work?
> 
> That works if you assign the function to a class instance, but not if 
> you assign it to a class.
> 
> def f1(x):
>      print(x)
> f1('The plain function')
> 
> class Class1:
>      pass
> 
> class Class2:
>      pass
> 
> c1 = Class1()
> c1.newfunc = f1
> c1.newfunc('f1 assigned to instance') # Works as intended
> 
> Class2.newfunc = f1
> c2 = Class2()
> c2.newfunc('f1 assigned to class')  # Complains about extra argument

If your requirements are not very tricky, you can write a 
convert-to-method function yourself:

def f1(x):
     print(x)
f1('The plain function')

class Class2:
     pass

def convert_method(f):
     """Assign existing method without a "self" arg
        as a class's method.
     """
     def fnew(instance, *args):
         f(*args)
     return fnew

Class2.newfunc = convert_method(f1)
c2 = Class2()
c2.newfunc('f1 assigned as method of Class2') # Prints the arg

This example does not make f1 aware of the self argument, but you asked 
to convert an existing function, and that function would not be aware of 
the self parameter. It's much like a decorator function, but is not here 
being used as a decorator. If you meant something else, please think out 
what you want and explain that.



More information about the Python-list mailing list