所以,举个例子:>>> def whatever():
... pass
...
>>> whatever
当我们使用def时,我们已经创建了一个对象,它是一个函数。例如,我们可以查看对象的属性:
^{pr2}$
回答你的问题-whatever()不是一种file.py的方法。最好将其视为绑定到file.py全局命名空间中名称whatever的函数对象。在>>> globals()
{'__builtins__': , '__name__': '__main__', '__d
oc__': None, 'whatever': }
或者从另一个角度来看,没有什么可以阻止我们将名称whatever完全绑定到另一个对象:>>> whatever
>>> whatever = "string"
>>> whatever
'string'
还有其他创建函数对象的方法。例如,lambdas:>>> somelambda = lambda x: x * 2
>>> somelambda
at 0x00AF5F30>
方法就像是一个函数对象的属性。使它成为方法的原因是这些方法绑定到对象上。这将导致对象作为我们通常称为self的第一个参数传递给函数。在
让我们用一个方法somemethod和一个实例someobject来定义一个类SomeClass:>>> class SomeClass:
... def somemethod(one="Not Passed", two="Not passed"):
... print "one = %s\ntwo = %s" % (one,two)
...
>>> someobject = SomeClass()
让我们把somemethod看作一个属性:>>> SomeClass.somemethod
>>> someobject.somemethod
我们可以看到它是对象上的绑定方法和类上的未绑定方法。现在让我们调用该方法,看看会发生什么:>>> someobject.somemethod("Hello world")
one = <__main__.SomeClass instance at 0x00AFE030>
two = Hello world
作为绑定方法,somemethod接收的第一个参数是对象,第二个参数是方法调用中的第一个参数。让我们调用类上的方法:>>> SomeClass.somemethod("Hello world")
Traceback (most recent call last):
File "", line 1, in
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
当你想从超类调用一个特定的方法时,你可以使用这种类型的方法调用——在类上调用一个方法。在