Как синтаксис был выбран для статических методов в Python?

Не можете Вы просто сделать что-то вроде этого:

List<K> tranformedList = originalList.Select(x => tranform(x))
                                 .Where(y => y != null) //Check for nulls
                                 .ToList();
14
задан Uri 25 September 2009 в 17:35
поделиться

8 ответов

Статические методы были добавлены в Python спустя много времени после того, как классы были добавлены (классы были добавлены очень рано, возможно, даже до 1.0; статические методы не появлялись примерно до 2.0). Они были реализованы как модификация обычных методов - вы создаете объект статического метода из функции, чтобы получить статический метод, тогда как компилятор по умолчанию генерирует методы экземпляра.

Как и во многих других случаях в Python, статические методы были представлены, а затем дорабатывались по мере того, как люди их использовали и хотели улучшить синтаксис. Первоначальный раунд был способом введения семантики без добавления нового синтаксиса к языку (а Python довольно устойчив к изменениям синтаксиса). Я не Гвидо, поэтому я не совсем уверен, что происходило у него в голове, и это несколько умозрительно, но Python имеет тенденцию двигаться медленно, постепенно развиваться,

12
ответ дан 1 December 2019 в 07:39
поделиться

voyager и adurdin хорошо вместе объясняют, что произошло: с введением классов и дескрипторов нового стиля в Python 2.2 появились новые и глубокие семантические возможности - - и наиболее очевидные полезные примеры (статические методы, методы класса, properties) поддерживались встроенными типами дескрипторов без какого-либо нового синтаксиса (синтаксис @foo для декораторов был добавлен парой выпусков позже, когда новые дескрипторы убедительно доказали свою реальность. мир полезности). Я не очень квалифицирован, чтобы направить Гвидо (где Тим Питерс, когда он вам нужен! -), но я уже был коммиттером Python в то время и участвовал в этих разработках, и я могу подтвердить, что это действительно произошло.

voyager's Наблюдение за этим напоминанием ему о C совершенно точно: я давно утверждал, что Python улавливает больше «духа C», чем любой из языков, имитирующих синтаксис языка C (фигурные скобки, круглые скобки после if / while и т. д.). "Дух C"

11
ответ дан 1 December 2019 в 07:39
поделиться

Гвидо всегда опасался добавлять в язык новые конструкции. Когда были предложены статические методы, было показано, что вы уже можете это сделать (с версии 2.2 существует декоратор staticmethod () ), у вас просто не было синтаксического сахар за это.

Если вы читаете PEP, вы можете увидеть всю дискуссию, которая идет о добавлении чего-либо. Мне, например, нравится такой подход. Это напоминает мне C тем, что здесь нет ненужных ключевых слов.

Когда новый синтаксис для декораторов был добавлен в Python 2.4, вы могли использовать существующие декораторы с более чистым синтаксисом.

В любом случае, они не так сильно отличаются, если вам нужно поддерживать старую систему.

#>2.4
class MyClass(object):
    @staticmethod
    def mystaticmethod(params)
        pass
        return

#<2.4
class MyClass(object):

    def mystaticmethod(params)
        '''Static Method'''
        pass
        return
    staticmethod(mystaticmethod)

Я бы рекомендовал вам добавить комментарий или строку документации к статическому методу screaming , который является статическим методом.

3
ответ дан 1 December 2019 в 07:39
поделиться

Статические методы в Python восходят к появлению так называемых «классов нового стиля» в Python 2.2. До этого методы в классах были просто обычными функциями, хранившимися как атрибуты в классе:

class OldStyleClass:
    def method(self):
        print "'self' is just the first argument of this function"

instance = OldStyleClass()
OldStyleClass.method(instance) # Just an ordinary function call
print repr(OldStyleClass.method) # "unbound method..."

Вызов методов в экземплярах обрабатывались специально для автоматической привязки экземпляра к первому аргументу функции:

instance.method() # 'instance' is automatically passed in as the first parameter
print repr(instance.method) # "bound method..."

В Python 2.2 много Система классов была переосмыслена и преобразована в «классы нового стиля» - классы, которые наследуются от объекта . Одной из особенностей классов нового стиля были «дескрипторы», по сути, объект в классе, который отвечает за описание, получение и установку атрибутов класса. Дескриптор имеет метод __ get __ , который передает класс и экземпляр и должен возвращать запрошенный атрибут класса или экземпляра.

Дескрипторы сделали возможным использование единого API для реализации сложного поведения атрибутов класса, таких как свойства, методы класса и статические методы. Например, дескриптор staticmethod может быть реализован следующим образом:

class staticmethod(object):
    """Create a static method from a function."""

    def __init__(self, func):
        self.func = func

    def __get__(self, instance, cls=None):
        return self.func

Сравните его с гипотетическим дескриптором чистого Python для обычного метода, который используется по умолчанию для всех простых функций в атрибутах классов (это это не совсем то, что происходит с поиском метода из экземпляра, но он обрабатывает автоматический аргумент «self»):

class method(object):
    """Create a method from a function--it will get the instance
    passed in as its first argument."""

    def __init__(self, func):
        self.func = func

    def __get__(self, instance, cls=None):
        # Create a wrapper function that passes the instance as first argument
        # to the original function
        def boundmethod(*args, **kwargs):
            return self.func(self, *args, **kwargs)
        return boundmethod

Итак, когда вы пишете method = staticmethod (method) , вы фактически создаете новый дескриптор, задача которого - вернуть исходную функцию без изменений и сохранить этот дескриптор в атрибуте "method" класса.

Если вам кажется, что нужно проделать много работы, чтобы вернуть исходную функцию - вы правы, это так. Но поскольку обычные вызовы методов являются случаем по умолчанию, статические методы и методы классов должны быть реализованы отдельно, а дескрипторы дают возможность задействовать эти и другие сложные поведения с помощью одного простого API.

Как уже отмечали другие, декоратор Синтаксис, введенный в Python 2.4, дает более удобный способ объявления статических методов, но это просто синтаксическое удобство и ничего не меняет в работе статических методов.

См. http: //www.python. org / doc / 2.2.3 / whatsnew / sect-rellinks.html и http://users.rcn.com/python/download/Descriptor.htm для получения дополнительных сведений о новом стиле. классы и дескрипторы.

4
ответ дан 1 December 2019 в 07:39
поделиться

Ситуация со статическим методом в Python является довольно прямым следствием проектных решений первоклассное все и все является исполняемым оператором . Как заявляли другие, статический метод стал доступен только с новой семантикой, разрешенной протоколом дескриптора Python 2.2, и синтаксически более приятным благодаря декораторам функций в Python 2.4. Статическим методам уделяется так мало внимания по простой причине - они никоим образом не расширяют возможности языка и лишь немного улучшают синтаксис. Семантически они эквивалентны простым старым функциям. Вот почему они были реализованы только тогда, когда возможности языка выросли достаточно, чтобы сделать их реализуемыми с точки зрения других языковых функций.

2
ответ дан 1 December 2019 в 07:39
поделиться

Starting in Python 2.4, one can also use a decorator as in:

   @staticmethod
   def mystaticethod(params)
      ...
      return

But I do not have any insight as to the genesis of this feature, as implemented orginially, in the language. But then again, I'm not Dutch :-) Do see Michael E's response in this post, regarding the late arrival of static methods in the evolution of Python.

BTW, for all their simplicity, as

 @MyDeco
 someObject

   is merely "syntactic sugar" for

  MyDeco(someObject)

decorators can be used for many other cool things!

2
ответ дан 1 December 2019 в 07:39
поделиться

Гвидо ведет блог История Python . Я думаю, что есть способ связаться с ним с просьбой расширить эту конкретную тему.

1
ответ дан 1 December 2019 в 07:39
поделиться

Возможно, разработчики изначально не думали, что статический метод нужен, когда можно использовать функцию. Поскольку в Python не было скрытия данных, в действительности нет необходимости в статических методах вместо использования классов в качестве пространств имен.

0
ответ дан 1 December 2019 в 07:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: