【问题标题】:Python: How do I alias a function with specific parameters?Python:如何为具有特定参数的函数起别名?
【发布时间】:2018-01-11 22:57:40
【问题描述】:

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

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

【问题讨论】:

  • 听起来您可能正在寻找functools.partial
  • @PatrickHaugh 这正是我想要的,谢谢!您是否知道是否有类的等价物来创建具有特定参数的实例?
  • 你能说得更具体一点吗?您是想拥有一个具有偏函数作为属性的类,还是尝试创建一个可以生成对象的偏函数?
  • 第二个,我想。例如,我想分配 var = Class(x=1, y=2, z=3) 然后使用“instance = var”而不是“instance = Class(x=1, y=2”创建一个实例, z=3)"

标签: python-3.x function parameters


【解决方案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

【讨论】:

    【解决方案2】:

    你总是可以做一个包装器:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 2017-08-04
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多