我正在尝试将一个函数指定为类属性,并在该类的不同实例中使用该函数的特定参数。所以,如果我有两个实例foo
和bar
,我希望foo.func()
在调用时运行function(param1)
并bar.func()
运行function(param2)
当它被调用时。
我尝试过像这样的事情:
class Class:
def __init__(self, func):
self.func = func
foo = Class(function(param1))
bar = Class(function(param2))
但是当我运行它时,foo = Class(function(param1))
语句只执行function(param1)
而不是创建一个新的Class实例。如果我尝试单独对函数进行别名,则会出现同样的问题,例如:
alias_func = function(param1)
foo = Class(alias_func)
有没有办法做到这一点?我真的不想为每个类的实例定义一个新函数,但我在搜索中没有找到任何关于它的东西。提前谢谢大家!
答案 0 :(得分:1)
您可以正常使用functools.partial
:
from functools import partial
class MyClass:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
abc = partial(MyClass, 'a', 'b', 'c')
test1 = abc()
test2 = abc()
print(test1.x) # prints a
assert test1 is not test2 # Make sure abc is producing different objects
答案 1 :(得分:0)
你总是可以制作一个包装器:
class my_class:
def __init__(self, *, before=[], after=[], named={}):
self.before = before
self.after = after
self.named = named
def wrap(self, fn, *args, **kwargs):
lmerge=self.before + list(args) + self.after
dmerge=self.named.copy()
dmerge.update(kwargs)
return fn(*lmerge, **dmerge)
w1=my_class(before=["before", "more"], after=["after"])
w2=my_class(before=["before"], after=["after"], named={'sep':"..."})
w1.wrap(print, "hi")
w1.wrap(print, "yo", sep="-")
w2.wrap(print, "itadakimasu")
w2.wrap(print, "hasta", "siempre", sep="-")
w3=my_class(named={'before':["more"]})
w4=w3.wrap(my_class, after=["less"])
w4.wrap(print, "zboing")