为什么分配给类属性的函数被视为实例方法?

2024-09-29 22:30:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编程一个对象,它有一个getCallable()方法返回一个函数。我想提供这个函数作为一个类属性,这样我就可以继承父类并为每个子类设置不同的函数

在我的例子中,对象是一个具有交互式输入字段的小部件,用户可以填充它来设置大多数函数和参数

问题是,函数似乎被视为实例方法,实例在被调用时作为第一个参数传递

为什么?如何修改代码,使实例不作为函数属性传递

下面是一个非常简单的例子,再现了我的问题:

def mult(a, b):
    return a * b


class MultiplierFilter(object):
    function = mult

    def __init__(self):
        super().__init__()
        self.multiplier = 1

    def parameters(self):
        return {
            "multiplier": self.multiplier}

    def setParameters(self, params):
        """
        :param dict params:
        :return:
        """
        self.multiplier = params.get("multiplier", 1)

    def getCallable(self):
        """Return a function that takes a number as only argument and returns
        another number.
        """
        mult = self.multiplier

        def f(value):
            return self.function(value, mult)
        return f


if __name__ == '__main__':
    multiplier_object = MultiplierFilter()
    multiplier_object.setParameters({"multiplier": 2})

    test_function = multiplier_object.getCallable()
    print(test_function(7.))

以及错误消息:

Traceback (most recent call last):
  File "C:/Users/Pierre/PycharmProjects/pyipsdk_tuto/2.py", line 39, in <module>
    print(test_function(7.))
  File "C:/Users/Pierre/PycharmProjects/pyipsdk_tuto/2.py", line 30, in f
    return self.function(value, mult)
TypeError: mult() takes 2 positional arguments but 3 were given

Tags: 对象实例方法函数testselfreturnobject
1条回答
网友
1楼 · 发布于 2024-09-29 22:30:55

不管你如何定义函数;它只是class定义末尾类的命名空间中的一个函数,因此被视为与在那里定义的任何其他函数一样。一个class块是全功能的Python代码,唯一重要的是块末尾的结果是什么

您想要的是用^{}装饰函数:

class MultiplierFilter:
    function = staticmethod(mult)

这将防止self在调用时隐式传递

相关问题 更多 >

    热门问题