如何在python中将函数作为参数传递给类
我想在初始化类时将函数传递给它。下面是我想出的一个玩具示例,它是有效的:如何在python中将函数作为参数传递给类,python,oop,Python,Oop,我想在初始化类时将函数传递给它。下面是我想出的一个玩具示例,它是有效的: def addition(self): return self.a + self.b def multiplication(self): return self.a * self.b class Test: def __init__(self, a, b, fcn): self.a = a self.b = b self.fcn =
def addition(self):
return self.a + self.b
def multiplication(self):
return self.a * self.b
class Test:
def __init__(self, a, b, fcn):
self.a = a
self.b = b
self.fcn = fcn
t = Test(3, 3, addition)
print t.fcn(t)
t = Test(3, 3, multiplication)
print t.fcn(t)
是否可以像调用其他类方法一样调用t.fcn()
答案是肯定的
def do_op(x,y,fn):
return fn(x,y)
def add(a,b):
return a+b
print do_op(5,4,add)
一节课也一样
class whatever:
def __init__(self,fn):
self.fn = fn
def do_it(self,*args,**kwargs):
return self.fn(*args,**kwargs)
#if you wanted the fn to have self as the first argument
#return self.fn(self,*args,**kwargs) #just pass self as first argument
x = whatever(add)
print x.do_it(5,8)
进一步了解你的要求(如果我没有看错的话)
或者你想要像这样的东西
from functools import partial
def add(self):
return self.a + self.b
class whatever:
def __init__(self,fn,a,b):
self.__dict__[fn.__name__] = partial(fn,self)
self.a,self.b = a,b
x = whatever(add,5,6)
x.add()
这种自省在部署的代码中有点危险…您尝试过吗
答案是肯定的
def do_op(x,y,fn):
return fn(x,y)
def add(a,b):
return a+b
print do_op(5,4,add)
一节课也一样
class whatever:
def __init__(self,fn):
self.fn = fn
def do_it(self,*args,**kwargs):
return self.fn(*args,**kwargs)
#if you wanted the fn to have self as the first argument
#return self.fn(self,*args,**kwargs) #just pass self as first argument
x = whatever(add)
print x.do_it(5,8)
进一步了解你的要求(如果我没有看错的话)
或者你想要像这样的东西
from functools import partial
def add(self):
return self.a + self.b
class whatever:
def __init__(self,fn,a,b):
self.__dict__[fn.__name__] = partial(fn,self)
self.a,self.b = a,b
x = whatever(add,5,6)
x.add()
这种自省在部署的代码中有点危险…您尝试过吗
答案是肯定的
def do_op(x,y,fn):
return fn(x,y)
def add(a,b):
return a+b
print do_op(5,4,add)
一节课也一样
class whatever:
def __init__(self,fn):
self.fn = fn
def do_it(self,*args,**kwargs):
return self.fn(*args,**kwargs)
#if you wanted the fn to have self as the first argument
#return self.fn(self,*args,**kwargs) #just pass self as first argument
x = whatever(add)
print x.do_it(5,8)
进一步了解你的要求(如果我没有看错的话)
或者你想要像这样的东西
from functools import partial
def add(self):
return self.a + self.b
class whatever:
def __init__(self,fn,a,b):
self.__dict__[fn.__name__] = partial(fn,self)
self.a,self.b = a,b
x = whatever(add,5,6)
x.add()
这种自省在部署的代码中有点危险…您尝试过吗
答案是肯定的
def do_op(x,y,fn):
return fn(x,y)
def add(a,b):
return a+b
print do_op(5,4,add)
一节课也一样
class whatever:
def __init__(self,fn):
self.fn = fn
def do_it(self,*args,**kwargs):
return self.fn(*args,**kwargs)
#if you wanted the fn to have self as the first argument
#return self.fn(self,*args,**kwargs) #just pass self as first argument
x = whatever(add)
print x.do_it(5,8)
进一步了解你的要求(如果我没有看错的话)
或者你想要像这样的东西
from functools import partial
def add(self):
return self.a + self.b
class whatever:
def __init__(self,fn,a,b):
self.__dict__[fn.__name__] = partial(fn,self)
self.a,self.b = a,b
x = whatever(add,5,6)
x.add()
这种自省在部署的代码中有点冒险…我不明白。为什么是-1?这是一个问题!我找到了答案。这不是重点吗?我猜-1是因为这是一个容易测试的答案。把它放进你的终端,你会发现是的,这是可能的。@想象一下:如果你把它放进终端,你会发现
t.fcn()
抛出一个错误。那是因为他没有正确调用它。如果t.fcn是print,那么它就可以了,或者如果他调用t.fcn(3,3),那么它也可以。但我明白你的意思,我不明白。为什么是-1?这是一个问题!我找到了答案。这不是重点吗?我猜-1是因为这是一个容易测试的答案。把它放进你的终端,你会发现是的,这是可能的。@想象一下:如果你把它放进终端,你会发现t.fcn()
抛出一个错误。那是因为他没有正确调用它。如果t.fcn是print,那么它就可以了,或者如果他调用t.fcn(3,3),那么它也可以。但我明白你的意思,我不明白。为什么是-1?这是一个问题!我找到了答案。这不是重点吗?我猜-1是因为这是一个容易测试的答案。把它放进你的终端,你会发现是的,这是可能的。@想象一下:如果你把它放进终端,你会发现t.fcn()
抛出一个错误。那是因为他没有正确调用它。如果t.fcn是print,那么它就可以了,或者如果他调用t.fcn(3,3),那么它也可以。但我明白你的意思,我不明白。为什么是-1?这是一个问题!我找到了答案。这不是重点吗?我猜-1是因为这是一个容易测试的答案。把它放进你的终端,你会发现是的,这是可能的。@想象一下:如果你把它放进终端,你会发现t.fcn()
抛出一个错误。那是因为他没有正确调用它。如果t.fcn是print,那么它就可以了,或者如果他调用t.fcn(3,3),那么它也可以。但我明白你的意思。如果你这样做,函数就不能访问self
。@user2357112是的。。。但这不是问题的一部分。。。如果您愿意,您当然可以将其self作为第一个参数…@JoranBeasley:但是您正处于OP已经拥有的示例代码的情况下。@Chet这是您想要的最后一个示例吗?如果您这样做,函数将无法访问self
。@user2357112是。。。但这不是问题的一部分。。。如果您愿意,您当然可以将其self作为第一个参数…@JoranBeasley:但是您正处于OP已经拥有的示例代码的情况下。@Chet这是您想要的最后一个示例吗?如果您这样做,函数将无法访问self
。@user2357112是。。。但这不是问题的一部分。。。如果您愿意,您当然可以将其self作为第一个参数…@JoranBeasley:但是您正处于OP已经拥有的示例代码的情况下。@Chet这是您想要的最后一个示例吗?如果您这样做,函数将无法访问self
。@user2357112是。。。但这不是问题的一部分。。。如果您愿意,您当然可以将其自身作为第一个参数…@JoranBeasley:但是您正处于OP已经拥有的示例代码的情况下。@Chet这是您想要的最后一个示例吗?