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.

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to