полезно ли когда-либо определять метод класса со ссылкой на себя, не называемый «я» в Python? - PullRequest
3 голосов
/ 06 августа 2009

Я учу себя Python и вижу следующее в Погружение в Python , раздел 5.3 :

По соглашению первый аргумент любого метода класса Python (ссылка на текущий экземпляр) называется self. Этот аргумент выполняет роль зарезервированного слова this в C ++ или Java, но self не является зарезервированным словом в Python, а просто соглашением об именах. Тем не менее, пожалуйста, не называйте это ничем, кроме self; это очень сильное соглашение.

Учитывая, что self является , а не ключевым словом Python, я предполагаю, что иногда может быть полезно использовать что-то еще. Есть ли такие случаи? Если нет, то почему это не ключевое слово?

Ответы [ 6 ]

9 голосов
/ 06 августа 2009

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

5 голосов
/ 06 августа 2009

В качестве дополнительного замечания обратите внимание, что Пилигрим совершает здесь общее неправильное использование терминов: метод класса - это совсем не то, что метод экземпляра , о котором он говорит. о здесь. Как говорит wikipedia , «метод - это подпрограмма, которая связана исключительно с классом (в этом случае он называется методом класса или статическим методом) или с объектом (в этом случае это метод экземпляра). Встроенные модули Python включают тип staticmethod для создания статических методов и тип classmethod для создания методов класса, каждый из которых обычно используется в качестве декоратора; если вы не используете ни один, def в теле класса создает метод экземпляра. E.g.:

>>> class X(object):
...   def noclass(self): print self
...   @classmethod
...   def withclass(cls): print cls
... 
>>> x = X()
>>> x.noclass()
<__main__.X object at 0x698d0>
>>> x.withclass()
<class '__main__.X'>
>>> 

Как видите, метод экземпляра noclass получает экземпляр в качестве аргумента, а метод класса withclass получает класс.

Так что было бы крайне вводящим в заблуждение и вводящим в заблуждение использование self в качестве имени первого параметра метода класса: в данном случае принято вместо этого использовать cls, как в моем пример выше. Хотя это всего лишь соглашение, на самом деле нет веских причин для его нарушения - больше, чем, скажем, для присвоения имени переменной number_of_cats, если целью переменной является подсчет собак! -)

4 голосов
/ 06 августа 2009

Единственный случай, который я видел, это когда вы определяете функцию вне определения класса, а затем назначаете ее классу, например ::10000

class Foo(object):
    def bar(self):
        # Do something with 'self'

def baz(inst):
    return inst.bar()

Foo.baz = baz

В этом случае self немного странно использовать, потому что функция может применяться ко многим классам. Чаще всего я видел вместо него inst или cls.

2 голосов
/ 06 августа 2009

У меня когда-то был какой-то код (и я извиняюсь за недостаток креативности в примере):

class Animal:
    def __init__(self, volume=1):
        self.volume = volume
        self.description = "Animal"

    def Sound(self):
        pass

    def GetADog(self, newvolume):
        class Dog(Animal):
            def Sound(this):
                return self.description + ": " + ("woof" * this.volume)
        return Dog(newvolume)

Тогда у нас есть вывод как:

>>> a = Animal(3)
>>> d = a.GetADog(2)
>>> d.Sound()
'Animal: woofwoof'

Я не был уверен, что self в классе Dog затеняет self в классе Animal, поэтому я решил вместо Dog ссылаться на слово "this". По моему мнению и для этого конкретного приложения, это было более ясно для меня.

1 голос
/ 06 августа 2009

Потому что это соглашение, а не синтаксис языка. Существует Руководство по стилю Python , которым следуют люди, которые программируют на Python. Таким образом, библиотеки имеют привычный внешний вид. Python уделяет большое внимание удобочитаемости, и последовательность является важной частью этого.

1 голос
/ 06 августа 2009

Я думаю, что основная причина, по которой self используется соглашением, а не ключевым словом Python, заключается в том, что проще, когда все методы / функции принимают аргументы одинаково, а не собирают разные формы аргументов для функций, класса методы, методы экземпляра и т. д.

Обратите внимание, что если у вас есть фактический метод класса (т. Е. Тот, который определен с использованием декоратора classmethod), то условием является использование "cls" вместо "self".

...