Python «я» для функции - PullRequest
       5

Python «я» для функции

4 голосов
/ 23 ноября 2010

Я прочитал пост SO * * * * * *. * * * * * * * * * * * * * * * * * * * * * * * * * * * *.Я думаю, что понимаю использование self в классах Python и соглашениях в них.

Однако, будучи относительно новым для Python и его идиом, я не могу понять, почему некоторые используют self в определении функции процедурного типа.Например, в документации Python о целочисленных типах пример функции:

def bit_length(self):
    s = bin(self)       # binary representation:  bin(-37) --> '-0b100101'
    s = s.lstrip('-0b') # remove leading zeros and minus sign
    return len(s)       # len('100101') --> 6

Замена self на num - это тот же функциональный результат;то есть:

def bit_length(num):
    s = bin(num)       # binary representation:  bin(-37) --> '-0b100101'
    s = s.lstrip('-0b') # remove leading zeros and minus sign
    return len(s)       # len('100101') --> 6

Нет такой идиомы, как __init__ и т. д., которую я могу увидеть здесь, почему self используется в первом случае.Я видел это использование self в других местах и ​​в процедурных функциях, и считаю его запутанным.

Итак, мой вопрос: если нет класса или метода, зачем использовать self в определении функции, а не в описательном имени параметра?

Ответы [ 2 ]

6 голосов
/ 23 ноября 2010

В примере bit_length определяется как функция для класса int, поэтому фактически существует «класс или метод». Идея состоит в том, что вы «запрашиваете» целое число, чтобы указать его битную длину, следовательно, оно определено для принятия себя в качестве аргумента.

4 голосов
/ 23 ноября 2010

Нет реальной причины. Но если вы собираетесь установить monkeypatch для существующего класса, он действует как уведомление для любого, кто может читать код.

...