【问题标题】:Storing a function within an object variable在对象变量中存储函数
【发布时间】:2013-12-03 15:07:25
【问题描述】:

我开始使用 python 并且正在处理一些相当复杂的代码,如果我的词汇量不够,请耐心等待。

在 Eclipse 中使用 pydev。

我在本地对象变量中存储函数时遇到了困难。该函数可以存储在一个普通的局部变量中,但如果它附加到对象(self)上,它将不起作用。

基本上,我有这样的东西:(例如概括)

foo = StackExchange(inputFunction)

(以下在不同的文件,相同的包中)

class StackExchange(object):
    def __init__(self,inputFunction):
        self.function = inputFunction
        self.test = 123
        function = inputFunction
        function2 = lambda x:x**2
        self.function2 = function2

以上,在eclipse中查看变量时,inputFunction存在且正确。

function 被创建并存储inputFunction

但是self 没有附加functionfunction2 变量(即self.function`)。

它确实有self.test(如预期的那样)

同样,function2 被创建并存储 lambda 函数,但不是 self.function2。我用这个例子来证明inputFunction 本身不是问题。

当然,我已经尝试过:

bar = function2
self.function2 = bar

但结果相同。

不确定这是 eclipse 的事情还是 python 的事情。当我逐步浏览 __init__ 的每一行时,self 变量的行为很奇怪,但我认为它不值得解释(但值得一提)。

谢谢!

编辑:

在您所有回复的帮助下测试后

我已经意识到这是 eclipse 和或(可能)它的 PyDev 插件的问题。

print foo.function 确实返回 lambda 函数,即使 eclipse 没有将变量 function 附加到对象 foo 上。我被误导了。

程序在尝试调用 foo.function 时失败的原因必须在于 inputFunction 本身。 非常感谢大家。

【问题讨论】:

  • 你能发布一个复制问题的代码示例吗?我怀疑您在此处提供的内容是从记忆中转录的,因为带有大写 C 的 Class 是语法错误。无论如何,对象确实可以存储函数;请参阅打印StackExchange.function 值的this 示例。
  • 类是一个错字。我正在从日食转录到这里。我来自java,习惯了。
  • 您提到,“在查看 eclipse 中的变量时,inputFunction 存在并且是正确的”。你如何看待变量?用print 语句输出它们?还是某种特定于 IDE 的方法,例如表达式窗口或变量名称上的工具提示?也许 Eclipse 不喜欢显示有关 lambda 的信息。你看bar是否存在?
  • 它是特定于 IDE 的——在调试透视图中有一个变量列表,它将显示变量及其值。我不打印。是的,bar 存在于列表中,function2(两个 lambdas)也存在,但只要我将它附加到self,它就会消失。我想它可能只是 IDE,我可以运行更多测试。感谢反馈

标签: python eclipse function store


【解决方案1】:

我不了解 Eclipse 和 pydev,但以下内容对我来说很好:

class StackExchange(object):
    def __init__(self, inputFunction):
        self.function = inputFunction
    def call(self, param):
        return self.function(param)

foo = StackExchange(lambda x: x**2)
print(foo.call(4))
=> 16

所以self.function 显然可以正常工作,就像在您的示例中一样。

【讨论】:

  • 我不知道为什么我不能在我的特定情况下重现这个。似乎我遗漏了一些明显的东西,因为它肯定可以工作。这与 inputFunction 在与类所在的文件不同的文件中定义没有任何关系?
  • 如果 inputFunction 未知,那么您会在 foo = StackExchange(inputFunction) 收到错误消息,所以 - 任何错误消息?另外,我想你做一个from <Modulename> import inputFunction?
  • 刚刚更新了我的问题,看来它确实工作正常,这只是 Eclipse 中的一个问题。感谢您的反馈。托尼,你能在调试器中运行它,看看self下面是否有function变量?
  • 我刚刚尝试了调试器并没有看到分配的功能......但它仍然有效。也许是 Pydev。
  • 一个类的方法需要自我传递作为它的唯一参数。这可能是你的问题吗?
【解决方案2】:

我做了 uselpa 的做法,所以这里需要考虑不同的方法。

您将方法分配给类,每个类和该类的每个实例化实例都会获得该方法。但是您添加的方法有一个“自我”论点......因为一个类的方法应该有自我,不是吗?希望这会有所帮助。

class StackExchange(object):
    def __init__(self):
        self.test = 123
        function2 = lambda x:x**2
        self.function2 = function2

def afunction(self):
    print 'something'

if __name__ == '__main__':
    beforese = StackExchange()
    if hasattr(beforese,'function'):
        beforese.function()
    else:
        print "beforese doesn't have function"
    StackExchange.function = afunction
    se = StackExchange()
    se.function()
    beforese.function()

【讨论】:

  • 我删除了'afunction'并将其放在另一个文件中并导入了它。 from afunctionfile import afunction,它仍然有效。
  • 嗨托尼,你能在调试器(eclipse)中运行它,看看self下面是否有function变量?
  • 我看到但看不到它,但它有效。这是你经历的吗?请注意,即使没有参数,类的方法也需要将 self 作为其唯一参数传递。这可能是你的问题吗?
  • 另外我真的不太确定 Lambda 函数作为类属性(的使用);你不能定义一个 X**2 的方法吗? @Tenwest
  • 所以我在一个不同的文件中定义了函数,其中有一个打印语句。我在该打印语句处添加了一个断点,并且它命中它,(除了打印它)——但没有作为变量/方法显示在 self 下。我还在 uselpa 的示例中添加了一个简单的变量;它显示了,但方法/函数不在 self 下的调试器中。
猜你喜欢
  • 1970-01-01
  • 2014-10-08
  • 2012-08-30
  • 2015-03-26
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 2011-01-03
相关资源
最近更新 更多