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

时间:2014-01-17 03:23:37

标签: python python-2.7

我正在尝试在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 个答案:

答案 0 :(得分: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()

答案 1 :(得分:6)

与您正在寻找的最接近的是lambda表达式,它不像正确编写的函数那样易于使用:

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

然而,在几乎所有情况下,定义一个函数并分配它,你在你的例子中所做的就是要走的路

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

descriptors后面发生了一些奇怪的魔法。在我看来,这不是一个完全OO的解决方案,但是......好吧,如果你想了解更多信息,这里有一个链接http://www.cafepy.com/article/python_attributes_and_methods/python_attributes_and_methods.html

答案 3 :(得分:0)

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

链接中的内容可能类似 create function dynamically