我正在寻求确认,如果我的思路在Python方法与函数方面是正确的:
方法是类的一部分。
函数在类之外定义。
所以例如。
class FooBar(object):
def __init__(self):
pass
def foo(self):
pass
def bar():
pass
if __name__ == '__main__':
fb = FooBar()
我理解def foo
定义方法,def bar
定义函数。我是对的吗?
答案 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
。)
关于输出的重要注意事项是,在前两种情况下,函数会收到两个参数:1
和2
。在最后两个案例中,他们收到三个论点:instance
,1
和2
。
在将instance
传递给函数的情况下,该函数的行为类似于方法。在传递instance
而不是的情况下,该函数的行为类似于普通函数。但请注意,两个行为都是由classe中定义的函数和类外定义的函数展示的。
重要的是如何查找功能。如果它被查找为类的实例的属性,则该函数的行为类似于方法;否则它就像一个自由函数。
[顺便提一下,这个绑定行为仅适用于纯Python函数;它不适用于使用Python / C API定义的函数。后者总是表现得像函数一样,从不喜欢方法:
C.dir = dir
instance.dir()
将为您提供全局范围的目录,而不是instance
,指示dir
已经获得零参数,而不是接收instance
作为参数。
]