【问题标题】:what constitutes a member of a class? What constitutes a method?什么是类的成员?什么是方法?
【发布时间】:2010-09-24 23:09:53
【问题描述】:

这个问题的答案似乎可以接受

什么是方法?

是

方法是属于类成员的函数。

我不同意这一点。

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. func 是 Foo 的成员吗?
  2. func是Foo的方法吗?

我很清楚,如果 func 有 self 参数,这将起作用。这很明显。我感兴趣的是它是否是foo 的成员,以及它是否是method。

【问题讨论】:

  • 而且正如我在其他 cmets 中所说的,你不能使用不运行的示例。
  • 它运行良好,直到您尝试将func 视为一种方法。这就是示例的重点。
  • 什么?你的代码没有意义。 func 从来都不是一种方法,那为什么它应该是一种方法呢?它不是任何班级的成员,您在任何地方都没有说过f.func = func 或类似的话,那么您期望会发生什么? func 不是 Foo 的成员。 func 不是 Foo 的方法。
  • @Blue Peppers。对不起,错字。我在边境时,一个醉汉对我说话。更正。引发这场辩论的原始版本没有那个错字。

标签: python


【解决方案1】:

你只是测试错了:

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

您忘记在def 中添加self 参数的错误与f.func“不是方法”完全无关,当然。将def 放在class 之外而不是在它里面的奇特自负(当然是完全合法的Python,但是,正如我所说,奇特)也与案例无关:如果你忘记了第一个参数(通常命名为 self)在您的 def 方法语句中,您当然会在调用它们时遇到错误(除其他情况外,只要调用中指定的实际参数可以' 不匹配 def 接受的形式参数,当然)。

【讨论】:

  • 但是我的例子的 whole 点是func 没有有第一个(因此,任何)参数,但它仍然是Foo的成员。
  • @Alex,我可以把你的回答当作func,按照定义,是是Foo的方法吗?跨度>
  • func 是一个名字。当用作 bare 名称时,它不会绑定到方法对象。当用作 qualified 名称时,即绑定到类或其实例的名称的属性,它提供的值 是 方法对象(碰巧,每次都有不同的方法对象:print f.func is f.func 显示False)。因此,“func 是一种方法”的断言既不是真的也不是假的:它没有意义。 (如果函数对象没有第一个参数,则无法正确调用方法对象,但当然不是意味着它不是方法对象!)。
  • 顺便说一句,print type(f.func) 确实证实了这一点,即,它显示InstanceMethod,完全独立于f.func 具有或缺少的参数。为什么你很难接受这种情况?!
  • @Alex。感谢您消除我的困惑。我确信我是对的,但现在我可以看出我的想法是错误的。
【解决方案2】:

如果 func 有一个 self 参数,则不会引发类型错误,就像任何其他实例方法一样。

这是因为当您评估 f.func 时,您实际上是在将 f 绑定到函数的第一个参数 - 然后它变成了一个部分应用程序,您可以向它提供更多参数。

如果你希望它是一个静态方法,那么你需要 staticmethod 装饰器,它只是丢弃第一个参数并将其余参数传递给原始函数。

所以有两种方法让它工作:

def func(self): pass

-- 或--

Foo.func = staticmethod(func)

取决于你的目标。

【讨论】:

    【解决方案3】:

    正如所写,func 是 Foo 的成员和 Foo 实例的方法,例如您的 f.但是,它不能成功调用,因为它至少不接受一个参数。

    func 在 f 的命名空间中,并且有一个 _call_() 方法。换句话说,当你像一个方法一样调用它时,Python 试图像一个方法一样调用它就足够了。如果它像鸭子一样嘎嘎叫,换句话说……

    在我看来,这个调用不成功既不是这里也不是那里。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 2011-12-04
      相关资源
      最近更新 更多