Python 有函数。因为一切都是对象functions are objects too。
所以,用你的例子:
>>> def whatever():
... pass
...
>>> whatever
<function whatever at 0x00AF5F30>
当我们使用def 时,我们创建了一个函数对象。例如,我们可以查看对象的一个属性:
>>> whatever.func_name
'whatever'
回答您的问题 - whatever() 不是 file.py 的方法。最好将其视为在file.py 的全局命名空间中绑定到名称whatever 的函数对象。
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__d
oc__': None, 'whatever': <function whatever at 0x00AF5EB0>}
或者换个角度来看,没有什么能阻止我们将名称 whatever 完全绑定到不同的对象:
>>> whatever
<function whatever at 0x00AF5F30>
>>> whatever = "string"
>>> whatever
'string'
还有其他方法可以创建函数对象。例如lambdas:
>>> somelambda = lambda x: x * 2
>>> somelambda
<function <lambda> at 0x00AF5F30>
方法就像是一个函数的对象的属性。使它成为方法的原因是方法绑定到对象。这会导致对象作为第一个参数传递给函数,我们通常称之为self。
让我们定义一个类SomeClass,带有一个方法somemethod和一个实例someobject:
>>> class SomeClass:
... def somemethod(one="Not Passed", two="Not passed"):
... print "one = %s\ntwo = %s" % (one,two)
...
>>> someobject = SomeClass()
让我们看看somemethod作为一个属性:
>>> SomeClass.somemethod
<unbound method SomeClass.somemethod>
>>> someobject.somemethod
<bound method SomeClass.somemethod of <__main__.SomeClass instance at 0x00AFE030
我们可以看到它是对象上的绑定方法和类上的未绑定方法。所以现在让我们调用该方法,看看会发生什么:
>>> someobject.somemethod("Hello world")
one = <__main__.SomeClass instance at 0x00AFE030>
two = Hello world
因为它是一个绑定方法,somemethod 收到的第一个参数是对象,第二个参数是方法调用中的第一个参数。让我们在类上调用方法:
>>> SomeClass.somemethod("Hello world")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method somemethod() must be called with SomeClass instance as first argument (got str instance instead)
Python 抱怨是因为我们试图在没有给它适当类型的对象的情况下调用该方法。所以我们可以通过“手动”传递对象来解决这个问题:
>>> SomeClass.somemethod(someobject,"Hello world")
one = <__main__.SomeClass instance at 0x00AFE030>
two = Hello world
当您想从超类调用特定方法时,您可以使用这种类型的方法调用 - 调用类上的方法。
(可以take a function and bind it to class to make it a method,但这不是您通常需要做的事情。)