Python 方法与函数

Nul*_*yte 3 python methods class function

我正在寻求确认我的想法在 Python 方法与函数方面是否正确:

方法是类的一部分。

函数是在类之外定义的。

所以例如

class FooBar(object):
    def __init__(self):
        pass
    def foo(self):
        pass


def bar():
    pass


if __name__ == '__main__':
    fb = FooBar()
Run Code Online (Sandbox Code Playgroud)

我理解def foo定义方法和def bar定义功能。我对么?

jua*_*aga 5

是的。明确地说,方法是函数,它们只是附加到类,当从实例调用该函数时,它会自动将该实例作为第一个参数隐式传递*。实际上,在何处定义该函数并不重要。考虑:

class FooBar:
    def __init__(self, n):
        self.n = n
    def foo(self):
        return '|'.join(self.n*['foo'])


fb = FooBar(2)

print(fb.foo())

def bar(self):
    return '*'.join(self.n*['bar'])

print(bar(fb))

FooBar.bar = bar

print(fb.bar())
Run Code Online (Sandbox Code Playgroud)

*我强烈建议阅读描述符 HOWTO。剧透警报,函数是描述符。这就是 Python 神奇地将实例传递给方法的方式(也就是说,所有函数对象都是描述符,__get__当类上的实例访问时,该方法将实例作为第一个参数传递给函数本身!。HOWTO 显示了所有这些的 Python 实现事情,包括如何property在纯 Python 中实现!


jac*_*acg 5

实际上,Python 中的方法和函数是完全一样的东西!

它的定义位置并不重要。重要的是如何查找它。

def defined_outside(*args):
    return args

class C:

    def defined_inside(*args):
        return args

C.defined_outside = defined_outside
defined_inside = C.defined_inside

instance = C()

print(         defined_inside (1,2))
print(         defined_outside(1,2))
print(instance.defined_inside (1,2))
print(instance.defined_outside(1,2))
Run Code Online (Sandbox Code Playgroud)

这给出了输出

(1, 2)
(1, 2)
(<__main__.C object at 0x7f0c80d417f0>, 1, 2)
(<__main__.C object at 0x7f0c80d417f0>, 1, 2)
Run Code Online (Sandbox Code Playgroud)

(这仅适用于 Python 3:其中两个将TypeError在 Python 2 中生成 a。)

关于输出需要注意的重要一点是,在前两种情况下,函数接收两个参数:12。在最后两种情况下,他们收到三个参数:instance12

在将 传递给函数的情况下instance,函数的行为类似于方法。instance在未传入情况下,该函数的行为类似于普通函数。但请注意,这两种行为都是由类内部定义的函数和类外部定义的函数表现出来的。

重要的是如何查找该函数。如果它被查找为类实例的属性,那么该函数的行为就像一个方法;否则它的行为就像一个自由函数。

[顺便说一句,这种绑定行为仅适用于纯Python函数;它不适用于使用 Python/C API 定义的函数。后者的行为总是像函数,而不像方法:

C.dir = dir
instance.dir()
Run Code Online (Sandbox Code Playgroud)

将为您提供全局范围的目录,而不是instance,表示dir接收到零参数,而不是instance作为参数接收。]