Почему Вы должны явно иметь “сам” аргумент в методе Python?

При определении метода на классе в Python это выглядит примерно так:

class MyClass(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

Но на некоторых других языках, таких как C#, у Вас есть ссылка на объект, что метод связывается с с "этим" ключевым словом, не объявляя это как аргумент в прототипе метода.

Действительно ли это было намеренным проектным решением языка в Python или является там некоторыми деталями реализации, которые требуют передачи "сам" как аргумент?

186
задан smci 29 June 2019 в 14:44
поделиться

5 ответов

Мне нравится заключать Дзэн Peters в кавычки Python. "Явный лучше, чем неявный".

В Java и C++, 'this.' может быть выведен, кроме тех случаев, когда у Вас есть имена переменной, которые лишают возможности выводить. Таким образом, Вы иногда нуждаетесь в нем и иногда делаете нет.

Python выбирает делать вещи как это явными, а не на основе правила.

Кроме того, так как ничто не подразумевается или предполагается, части реализации представлены. self.__class__, self.__dict__ и другие "внутренние" структуры доступны очевидным способом.

89
ответ дан Nathan Fellman 23 November 2019 в 05:50
поделиться

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

, например,

>>> class C(object):
...     def foo(self):
...         print "Hi!"
...
>>>
>>> def bar(self):
...     print "Bork bork bork!"
...
>>>
>>> c = C()
>>> C.bar = bar
>>> c.bar()
Bork bork bork!
>>> c.foo()
Hi!
>>>

Это также (насколько я знаю) делает реализацию времени выполнения Python легче.

58
ответ дан Ryan 23 November 2019 в 05:50
поделиться

Я предлагаю, чтобы читал блог Guido van Rossum по этой теме - , Почему явный сам должен остаться .

, Когда определение метода украшено, мы не знаем, дать ли автоматически его 'сам' параметр или нет: декоратор мог превратить функцию в статический метод (который имеет не 'сам'), или метод класса (который имеет забавный вид сам, который относится к классу вместо экземпляра), или она могла сделать что-то совершенно другое (это тривиально, чтобы записать декоратору, который реализует '@classmethod' или '@staticmethod' в чистом Python). Нет никакого пути, не зная то, что делает декоратор, обеспечить ли метод, определяемый неявным 'сам' аргумент или нет.

я отклоняю взломы как специальное преобразование регистра '@classmethod' и '@staticmethod'.

52
ответ дан Acumenus 23 November 2019 в 05:50
поделиться

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

16
ответ дан Victor Noagbodji 23 November 2019 в 05:50
поделиться

Существует также другой очень простой ответ: согласно дзэн python, "явный лучше, чем неявный".

-4
ответ дан Flávio Amieiro 23 November 2019 в 05:50
поделиться
Другие вопросы по тегам:

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