Есть ли функции в Python, или все это метод? - PullRequest
8 голосов
/ 30 ноября 2009

Или это все метод?

Поскольку все является объектом,

def whatever:

это просто метод этого file.py, верно?

Ответы [ 3 ]

31 голосов
/ 30 ноября 2009

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

Вы можете использовать вызовы методов этого типа - вызов метода в классе - когда вы хотите вызвать конкретный метод из суперкласса.

(Можно взять функцию и связать ее с классом, чтобы сделать ее методом , но это обычно не то, что вам обычно нужно делать.)

2 голосов
/ 30 ноября 2009

В отличие от Java в Python, файл с именем file.py не обязательно содержит класс с именем file, как можно было бы ожидать, если бы это был файл Java с именем file.java.

В Python файл - это модуль, который на самом деле представляет собой просто пространство имен (более сопоставимое с пакетом Java, чем класс Java), а не класс. Рассмотрим пример file.py ниже:

def whatever_func():
    print "What ever function"

class SomeClass(object):
    def whatever_meth(self):
        print "What ever method"

В приведенном выше примере модуль / пространство имен file содержит обычную функцию с именем whatever_func и класс SomeClass, который имеет метод whatever_meth.

0 голосов
/ 30 ноября 2009

Хмм ... Вы можете работать с «чем угодно» как с обычной функцией в пространстве имен файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...