Python:如何使用特定参数对函数进行别名?

时间:2018-01-11 22:57:41

标签: python-3.x function parameters

我正在尝试将一个函数指定为类属性,并在该类的不同实例中使用该函数的特定参数。所以,如果我有两个实例foobar,我希望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)

有没有办法做到这一点?我真的不想为每个类的实例定义一个新函数,但我在搜索中没有找到任何关于它的东西。提前谢谢大家!

2 个答案:

答案 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")