似乎是问题的可接受答案
什么是方法?
是
方法是一个类的成员函数。
我不同意这一点。
class Foo(object):
pass
def func():
pass
Foo.func = func
f = Foo()
print "fine so far"
try:
f.func()
except TypeError:
print "whoops! func must not be a method after all"
func
是Foo
的成员吗?func
是Foo
的方法吗?我很清楚,如果func
有一个self
参数,这将有效。这很明显。我感兴趣的是它是否是foo
的成员,如果它是method
的话。
答案 0 :(得分:6)
你只是测试错了:
>>> class Foo(object): pass
...
>>> def func(self): pass
...
>>> Foo.func = func
>>> f = Foo()
>>> f.func()
>>>
你忘记在def
self
参数中的错误与f.func
完全没有关系,“当然不是一种方法”。 def
在class
之外而不是在self
之内而不是在其内部的特殊自负(当然,完全合法的Python,但正如我所说的那样,特殊)与案件无关:如果你忘记了在方法的def
语句中有一个第一个参数(通常命名为TypeError
),当你调用它们时会遇到错误(当然,def
是你得到的,其他情况,当调用中指定的实际参数与{{1}}接受的正式参数不匹配时,当然)。
答案 1 :(得分:1)
如果func
具有自参数,则不会抛出类型错误,就像任何其他实例方法一样。
那是因为当你评估f.func
时,你实际上是将f
绑定到函数的第一个参数 - 然后它变成了一个部分应用程序,你可以提供进一步的参数。
如果你想让它成为一个静态方法,那么你需要staticmethod装饰器,它只丢弃第一个参数并将其余参数传递给原始函数。
有两种方法可以使它发挥作用:
def func(self): pass
- 或 -
Foo.func = staticmethod(func)
取决于你的目标。
答案 2 :(得分:0)
如上所述,func是Foo的成员,也是Foo实例的方法,例如你的f。但是,它无法成功调用,因为它不接受至少一个参数。
func位于f的命名空间中,并且具有_ 调用_ ()方法。换句话说,当你像调用它时,Python试图将其称为一个方法就足够了。如果它像鸭子一样嘎嘎叫,换句话说......
在我看来,这个电话不成功既不在这里,也不在那里。
但也许是对“但医生的正确回应!当我不接受某个类中定义的函数中的任何参数时,我会对它是否真的 方法感到困惑!”只是“不要那样做”。 : - )