在Python中在运行时将方法分配给对象

4

我正在尝试用Python实现与Javascript相当的操作:

a.new_func = function(arg1, arg2) {
    var diff = arg1 - arg2;
    return diff * diff;
}

现在,我是先定义方法,然后再赋值的方式来完成这个任务的。但我的问题是Python是否允许一种缩写方式,在同一行中同时进行赋值和定义。就像这样:

a.new_func = def new_func(arg1, arg2):
    diff = arg1 - arg2
    return diff * diff

不要这样写:

def new_func(arg1, arg2):
    diff = arg1 - arg2
    return diff * diff
a.new_func = new_func

我知道这种差异并不是很大,但我仍然想知道是否可能实现。

4个回答

9

Python不支持这样的语法。

我想如果你希望的话,可以编写一个装饰器。这样可能会更漂亮:

def method_of(instance):
    def method_adder(function):
        setattr(instance, function.__name__, function)
        return function
    return method_adder

@method_of(a)
def new_func(arg1, arg2):
    stuff()

或者如果您想让该方法访问self

def method_of(instance):
    def method_adder(function):
        setattr(instance, function.__name__, function.__get__(instance))
        return function
    return method_adder

@method_of(a)
def new_func(self, arg1, arg2):
    stuff()

这实际上比我预期的要整洁得多。如果我需要动态地向对象添加方法,我可能会使用装饰器。我想知道这个方法已经被重新发明了多少次。 - user2357112

6

您寻找的最接近的东西是 Lambda 表达式,它们不像正确编写的函数使用起来那么容易:

a.new_function = lambda arg1,arg2 : (arg1-arg2)**2

然而,在几乎所有情况下,按照你在示例中的方式定义和分配函数是正确的做法。

1
你应该注意实例方法不是lambda表达式。
例如,让我们在IPython中进行一个简单的实验。
In [12]: class A:
   ....:     def f(self):
   ....:         return 1
   ....:     

In [13]: A.f.__class__
Out[13]: instancemethod

In [14]: another_f = lambda self: 1

In [15]: another_f.__class__
Out[15]: function

尝试将属性绑定到lambda时,在调用时会失败。
In [27]: an_instance = A()

In [28]: an_instance.g = lambda self: 2

In [29]: an_instance.g()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-29-5122c91d3e8f> in <module>()
----> 1 an_instance.g()

TypeError: <lambda>() takes exactly 1 argument (0 given)

你应该做的是,用types.MethodType来包装lambda。
In [31]: an_instance.g = types.MethodType(lambda self: 2, an_instance)

In [32]: an_instance.g()
Out[32]: 2

有一种奇怪的魔法叫做描述符,在我看来,这不是一个很好的面向对象的解决方案,但是......如果你想了解更多信息,请点击链接http://www.cafepy.com/article/python_attributes_and_methods/python_attributes_and_methods.html


0

所以我假设你想知道如何定义函数运行时。

可能类似于链接中的内容 动态创建函数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接