什么构成一个班级的成员?什么构成方法?

时间:2010-09-24 23:09:53

标签: python

似乎是问题的可接受答案

  

什么是方法?

  

方法是一个类的成员函数。

我不同意这一点。

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"
  1. funcFoo的成员吗?
  2. funcFoo的方法吗?
  3. 我很清楚,如果func有一个self参数,这将有效。这很明显。我感兴趣的是它是否是foo的成员,如果它是method的话。

3 个答案:

答案 0 :(得分:6)

你只是测试错了:

>>> class Foo(object): pass
... 
>>> def func(self): pass
... 
>>> Foo.func = func
>>> f = Foo()
>>> f.func()
>>> 

你忘记在def self参数中的错误与f.func完全没有关系,“当然不是一种方法”。 defclass之外而不是在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试图将其称为一个方法就足够了。如果它像鸭子一样嘎嘎叫,换句话说......

在我看来,这个电话不成功既不在这里,也不在那里。

但也许是对“但医生的正确回应!当我不接受某个类中定义的函数中的任何参数时,我会对它是否真的 方法感到困惑!”只是“不要那样做”。 : - )