Python方法与函数

时间:2017-10-08 21:20:27

标签: python function class methods

我正在寻求确认,如果我的思路在Python方法与函数方面是正确的:

方法是类的一部分。

函数在类之外定义。

所以例如。

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


def bar():
    pass


if __name__ == '__main__':
    fb = FooBar()

我理解def foo定义方法,def bar定义函数。我是对的吗?

2 个答案:

答案 0 :(得分:1)

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

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())

*我强烈建议您阅读descriptor HOWTO。扰流警报,Functions are descriptors。这就是Python神奇地将实例传递给方法的方式(也就是说,所有函数对象都是描述符,当{1}}方法的实例访问实例时,它将实例作为函数本身的第一个参数传递给它。 class! .HOWTO展示了所有这些内容的Python实现,包括如何在纯Python中实现__get__

答案 1 :(得分:1)

实际上,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))

给出输出

(1, 2)
(1, 2)
(<__main__.C object at 0x7f0c80d417f0>, 1, 2)
(<__main__.C object at 0x7f0c80d417f0>, 1, 2)

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

关于输出的重要注意事项是,在前两种情况下,函数会收到两个参数:12。在最后两个案例中,他们收到三个论点:instance12

在将instance传递给函数的情况下,该函数的行为类似于方法。在传递instance 而不是的情况下,该函数的行为类似于普通函数。但请注意,两个行为都是由classe中定义的函数和类外定义的函数展示的。

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

[顺便提一下,这个绑定行为仅适用于纯Python函数;它不适用于使用Python / C API定义的函数。后者总是表现得像函数一样,从不喜欢方法:

C.dir = dir
instance.dir()

将为您提供全局范围的目录,而不是instance,指示dir已经获得零参数,而不是接收instance作为参数。 ]