При определении метода для класса в Python он выглядит примерно так:
class MyClass(object):
def __init__(self, x, y):
self.x = x
self.y = y
Но в некоторых других языках, таких как C #, у вас есть ссылка на объект, к которому привязан метод, с ключевым словом "this" без объявления его в качестве аргумента в прототипе метода.
Было ли это преднамеренным решением о дизайне языка в Python или есть некоторые детали реализации, которые требуют передачи «я» в качестве аргумента?
self
для доступа к участникам - stackoverflow.com/questions/910020/…Ответы:
Мне нравится цитировать Питерса Zen of Python. «Явное лучше, чем неявное».
В Java и C ++ «
this.
» может быть выведено, кроме случаев, когда у вас есть имена переменных, которые делают невозможным вывод. Так что иногда это нужно, а иногда нет.Python решает сделать такие вещи явными, а не основанными на правиле.
Кроме того, поскольку ничего не подразумевается или не предполагается, части реализации раскрыты.
self.__class__
,self.__dict__
И другие «внутренние» структуры доступны очевидным образом.источник
Это минимизировать разницу между методами и функциями. Это позволяет вам легко генерировать методы в метаклассах или добавлять методы во время выполнения к уже существующим классам.
например
Это также (насколько я знаю) облегчает реализацию среды выполнения Python.
источник
self
в объявлении функции это не требуется (учтите, возможно, это бросает камни из стеклянного дома, поскольку JavaScript имеет довольно сложнуюthis
семантику связывания)Я предлагаю прочитать блог Гвидо ван Россума на эту тему - Почему явное «я» должно остаться .
источник
Python не заставляет вас использовать «себя». Вы можете дать ему любое имя. Вам просто нужно помнить, что первый аргумент в заголовке определения метода является ссылкой на объект.
источник
@staticmethod
этим нет.Также позволяет вам сделать это: (короче говоря, вызов
Outer(3).create_inner_class(4)().weird_sum_with_closure_scope(5)
вернет 12, но сделает это самым безумным способом.Конечно, это сложнее представить в таких языках, как Java и C #. Сделав ссылку на себя явной, вы можете ссылаться на любой объект по этой ссылке. Кроме того, такой способ игры с классами во время выполнения сложнее сделать на более статичных языках - не обязательно это хорошо или плохо. Просто явное я допускает существование всего этого безумия.
Кроме того, представьте себе следующее: мы хотели бы настроить поведение методов (для профилирования или какой-то безумной черной магии). Это может привести нас к мысли: что если бы у нас был класс
Method
, поведение которого мы могли бы переопределить или контролировать?Ну вот оно:
А теперь:
InnocentClass().magic_method()
будет действовать как ожидалось. Метод будет связан сinnocent_self
параметромInnocentClass
иmagic_self
экземпляром MagicMethod. Странно, да? Это как иметь 2 ключевых словаthis1
иthis2
на таких языках, как Java и C #. Подобная магия позволяет фреймворкам делать вещи, которые в противном случае были бы гораздо более многословными.Опять же, я не хочу комментировать этику этого материала. Я просто хотел показать вещи, которые было бы сложнее сделать без явной ссылки на себя.
источник
OuterClass.this
чтобы получить 'self' из внешнего класса, но вы все равно можете использовать егоthis
как ссылку на себя; очень похоже на то, что вы делаете здесь, в Python. Для меня не было сложнее представить это. Может быть, это зависит от уровня владения данным языком?Something
, который, в свою очередь, определен внутри еще одной анонимной реализацииSomething
? В Python вы можете, конечно, обратиться к любой из областей.this
. Неявные ссылки невозможны в Java.this
результат. НапримерObject self1 = this;
(либо используйте Object, либо что-то менее общее). Тогда, если у вас есть доступ к переменной в высших областях, вы могли бы иметь доступ кself1
,self2
...selfn
. Я думаю, что они должны быть объявлены окончательными или что-то, но это может сработать.Я думаю, что настоящая причина, помимо "Дзен Питона", заключается в том, что функции - это люди первого класса в Python.
Что по существу делает их Объектом. Теперь фундаментальный вопрос: если ваши функции также являются объектами, то в объектно-ориентированной парадигме как бы вы отправляли сообщения объектам, если сами сообщения являются объектами?
Похоже на проблему куриного яйца, чтобы уменьшить этот парадокс, единственный возможный способ - передать контекст выполнения методу или обнаружить его. Но так как python может иметь вложенные функции, это невозможно сделать, так как контекст выполнения изменится для внутренних функций.
Это означает, что единственно возможное решение - явно передать «я» (контекст выполнения).
Поэтому я считаю, что это проблема реализации, дзен появился намного позже.
источник
Я думаю, что это связано с ПКП 227:
источник
Как объяснил в себе в Python, Демистифицированный
Вызовы:
init () определяет три параметра, но мы только что передали два (6 и 8). Точно так же для distance () требуется один, но передано ноль аргументов.
Почему Python не жалуется на несоответствие номера аргумента ?
источник
Есть и другой очень простой ответ: согласно дзену python «явное лучше, чем неявное».
источник