Это связано с тем, что при разработке python альтернативы вряд ли будут работать. Python разработан, чтобы позволить методам или функциям быть определенными в контексте, где неявные this
(а-ля Java / C ++) или явные @
(а-ля ruby) не будут работать. Давайте рассмотрим пример с явным подходом с соглашениями Python:
def fubar(x):
self.x = x
class C:
frob = fubar
Теперь функция fubar
не будет работать, поскольку она предполагает, что self
является глобальной переменной (и в frob
также). Альтернативой может быть выполнение методов с замененной глобальной областью действия (где self
- это объект).
Неявный подход будет
def fubar(x)
myX = x
class C:
frob = fubar
Это будет означать, что myX
будет интерпретироваться как локальная переменная в fubar
(и в frob
также). Альтернативой здесь было бы выполнение методов с замененной локальной областью действия, которая сохраняется между вызовами, но это исключило бы возможность использования локальных переменных метода.
Однако текущая ситуация хорошо работает:
def fubar(self, x)
self.x = x
class C:
frob = fubar
здесь при вызове в качестве метода frob
получит объект, для которого он вызван, с помощью параметра self
, а fubar
все еще может быть вызван с объектом в качестве параметра и будет работать так же (это тоже самое что и C.frob
думаю).