Python имеет функции. Поскольку все является объектом функции также являются объектами .
Итак, чтобы использовать ваш пример:
>>> def whatever():
... pass
...
>>> whatever
<function whatever at 0x00AF5F30>
Когда мы используем def
, мы создали объект, который является функцией. Мы можем, например, посмотреть на атрибут объекта:
>>> whatever.func_name
'whatever'
В ответ на ваш вопрос - whatever()
- это , а не a , метод из file.py
. Лучше думать о нем как о функциональном объекте, связанном с именем whatever
в глобальном пространстве имен file.py
.
>>> 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'
Существуют и другие способы создания функциональных объектов. Например, лямбда :
>>> 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
Вы можете использовать вызовы методов этого типа - вызов метода в классе - когда вы хотите вызвать конкретный метод из суперкласса.
(Можно взять функцию и связать ее с классом, чтобы сделать ее методом , но это обычно не то, что вам обычно нужно делать.)