- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
使用以下脚本:
import time
class Foo(object):
func = time.gmtime
def go(self):
return self.func(0.0)
print time.strftime('%Y', Foo().go())
我得到以下输出:
1970
但是,如果我稍作修改并包装 time.gmtime
:
import time
def tmp(stamp):
return time.gmtime(stamp)
class Foo(object):
func = tmp
def go(self):
return self.func(0.0)
print time.strftime('%Y', Foo().go())
然后我得到以下错误:
Traceback (most recent call last):
File "./test.py", line 13, in <module>
print time.strftime('%Y', Foo().go())
File "./test.py", line 11, in go
return self.func(0.0)
TypeError: tmp() takes exactly 1 argument (2 given)
很明显,它试图调用 Foo.func
,就好像它是一个实例方法一样,并将 self
作为第一个参数传递。
两个问题:
time.gmtime
和 tmp
都是采用单个参数的函数,那么为什么这两个脚本的行为不同?最佳答案
- Both
time.gmtime
andtmp
are functions that take a single argument, so why do the two scripts behave differently?
让我们了解当您这样做时 Python 会做什么
self.func
来自 the documentation ,
When an instance attribute is referenced that isn’t a data attribute, its class is searched. If the name denotes a valid class attribute that is a function object, a method object is created by packing (pointers to) the instance object and the function object just found together in an abstract object: this is the method object. When the method object is called with an argument list, a new argument list is constructed from the instance object and the argument list, and the function object is called with this new argument list.
因此,如果 func
是 self
中的有效函数对象,那么将创建一个绑定(bind)方法对象,它需要第一个参数成为调用此函数的对象。
现在让我们比较一下,
print type(time.gmtime)
class Foo(object):
func = time.gmtime
def go(self):
print type(self.func)
return self.func(0.0)
当 go
被 Foo().go()
调用时,它会打印
<type 'builtin_function_or_method'>
<type 'builtin_function_or_method'>
没错。由于 time.gmtime
是内置函数(与函数对象不同),因此这里没有创建绑定(bind)方法对象。现在让我们试试你的第二个例子,
def tmp(stamp):
return time.gmtime(stamp)
print type(tmp), tmp
class Foo(object):
func = tmp
def go(self):
print type(self.func), self.func
return self.func(0.0)
会打印
<type 'function'> <function tmp at 0x7f34d9983578>
<type 'instancemethod'> <bound method Foo.tmp of <__main__.Foo object at ...>>
因为 tmp
是一个函数对象,根据上面显示的文档,创建了一个绑定(bind)方法对象,它期望 Foo
的对象作为第一个参数。因此,tmp
实际上作为 instancemethod
绑定(bind)到 Foo
。当你像 Foo().go()
一样调用 go
时,它会在内部像这样调用 tmp
Foo.func(self, 0.0)
这是有效的
tmp(self, 0.0)
这就是为什么你会收到以下错误
TypeError: tmp() takes exactly 1 argument (2 given)
- How can I safely save an ordinary function in a class/instance attribute and call it later from an instance method?
解决方案一:
引用 Python documentation再次,
It is also important to note that user-defined functions which are attributes of a class instance are not converted to bound methods; this only happens when the function is an attribute of the class.
这意味着,当您将用户定义的函数分配给类变量时,绑定(bind)方法构造就会发生。但是,如果您将它分配给一个实例,那么它就不会发生。
所以,你可以利用它来发挥你的优势,就像这样
import time
def tmp(stamp):
return time.gmtime(stamp)
class Foo(object):
def __init__(self):
self.func = tmp # Instance variable, not a class variable
def go(self):
return self.func(0.0)
print time.strftime('%Y', Foo().go())
在这里,self.func
将转换为 tmp(0.0)
,因为没有绑定(bind)方法构造发生。
解决方案 2:
使用staticmethod
像这样的功能
class Foo(object):
func = staticmethod(tmp)
def go(self):
# `return Foo.func(0.0)` This will also work
return self.func(0.0)
现在,self.func
仍会引用 tmp
。它类似于这样定义你的类
class Foo(object):
@staticmethod
def func(stamp):
return time.gmtime(stamp)
def go(self):
# `return Foo.func(0.0)` This will also work
return self.func(0.0)
关于python - 调用保存在类属性中的函数 : different behavior with built-in function vs. 普通函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28007368/
main.cpp #include "Primes.h" #include int main(){ std::string choose; int num1, num2; w
似乎函数 qwertyInches() 应该可以工作但是当我在 main() 中调用它时它给了我 [Error] called object 'qwertyInches' is not a funct
我无法理解 C++ 语法的工作原理。 #include using namespace std; class Accumulator{ private: int value; public:
在 类中声明 函数成员时,我们可以同时执行这两种操作; Function first; Function() second; 它们之间有什么区别? 最佳答案 Function 代表任意函数: void
“colonna”怎么可能是一个简单的字符串: $('td.' + colonna).css('background-color','#ffddaa'); 可以正确突出显示有趣单元格的背景,并且: $
我正在尝试将网页中的动态参数中继到函数中,然后函数将它们传递给函数内部的调用。比如下面这个简化的代码片段,现在这样,直接传入参数是没有问题的。但是,如何在不为每个可能的 colorbox 参数设置 s
C++ 中是否有一种模式允许您返回一个函数,它返回一个函数本身。例如 std::function func = ...; do { func = func(); } while (func);
我正在将 Windows 程序集移植到 Linux。我有一些代码要移植。我实际上是 linux 中 C 的新手。我知道 C 基础知识是一样的! typedef struct sReader {
我一直在寻找一个很好的解释,所以我很清楚。示例: this.onDeleteHandler(index)}/> 对比 对比 this.nameChangedhandler(event, perso
function(){}.__proto__ === Function.prototype 和 Function.prototype === function(){}.__proto__ 得到不同的结
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function 据说 Propert
VBA 中的函数没有特殊类型。我很难理解如何在 Excel VBA 中将函数作为参数添加到函数中。 我想要完成的是这样的事情: function f(g as function, x as strin
所以我正在尝试制作一个包(我没有在下面包含我的 roxygen2 header ): 我有这个功能: date_from_text % dplyr::mutate(!!name := lubr
尝试从 std::function 派生一个类,对于初学者来说,继承构造函数。这是我的猜测: #include #include using namespace std; template cla
我正在尝试编写一个返回另一个函数的函数。我的目标是编写一个函数,它接受一个对象并返回另一个函数“search”。当我使用键调用搜索函数时,我想从第一个函数中给定的对象返回该键的值。 propertyO
我非常清楚函数式编程技术和命令式编程技术之间的区别。但是现在有一种普遍的趋势是谈论“函数式语言”,这确实让我感到困惑。 当然,像 Haskell 这样的一些语言比 C 等其他语言更欢迎函数式编程。但即
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 8 年前。 Improv
我在stackoverflow上查过很多类似的问题,比如call.call 1 , call.call 2 ,但我是新人,无法发表任何评论。我希望我能找到关于 JavaScript 解释器如何执行这些
向 Twilio 发送 SMS 时,Twilio 会向指定的 URL 发送多个请求,以通过 Webhook 提供该 SMS 传送的状态。我想让这个回调异步,所以我开发了一个 Cloud Functio
作为 IaC 的一部分,A 功能应用 ,让我们将其命名为 FuncAppX 是使用 Terraform 部署的,它有一个内置函数。 我需要使用 Terraform 在函数应用程序中访问相同函数的 Ur
我是一名优秀的程序员,十分优秀!