python без самоконтроля

#python #class #self

#python #класс #self

Вопрос:

это работает желаемым образом:

 class d:
    def __init__(self,arg):
        self.a = arg
    def p(self):
        print "a= ",self.a

x = d(1)
y = d(2)
x.p()
y.p()
  

выдающий

 a=  1
a=  2
  

я попытался исключить «self» ы и использовать глобальный оператор в __init__

 class d:
    def __init__(self,arg):
        global a
        a = arg
    def p(self):
        print "a= ",a

x = d(1)
y = d(2)
x.p()
y.p()
  

уступающий, нежелательно:

 a=  2
a=  2
  

есть ли способ написать это без использования «self»?

Комментарии:

1. Чего вы на самом деле пытаетесь достичь?

2. пытаюсь сделать свой код более читабельным.

3. Это сделало бы его а) менее питоническим и б) сломанным.

4.Конечно global a , приводит к a разделяемости всеми экземплярами. Это в значительной степени определение глобальной переменной.

Ответ №1:

«self» — это способ, которым работает Python. Итак, ответ таков: Нет! Если вы хотите обрезать волосы: вам не обязательно использовать «self». Подойдет и любое другое имя. 😉

Комментарии:

1. ОК… значит, я просто должен привыкнуть к тому, что в моем коде много «само»?

2. @mike: Да, точка, новый абзац. Вы в значительной степени задаете эквивалент Python «как я могу избежать препроцессора в C и C «.

3. «многое» зависит от вашей точки зрения, но, очевидно, больше, чем в других языках. Слишком большое их количество может указывать на проблему с вашим кодом.

4. «Явное лучше, чем неявное»

5. Посмотрите на светлую сторону, у вас не возникнет соблазна добавлять m_ к своим переменным-членам только для уточнения пространств имен, к которым осуществляется доступ внутри метода 🙂

Ответ №2:

Методы Python — это просто функции, которые привязаны к классу или экземпляру класса. Единственное отличие заключается в том, что метод (он же связанная функция) ожидает объект экземпляра в качестве первого аргумента. Кроме того, когда вы вызываете метод из экземпляра, он автоматически передает экземпляр в качестве первого аргумента. Итак, определяя self в методе, вы указываете ему пространство имен для работы.

Таким образом, когда вы указываете, self.a метод знает, что вы изменяете переменную экземпляра a , которая является частью пространства имен экземпляра.

Область видимости Python работает изнутри, поэтому каждая функция (или метод) имеет свое собственное пространство имен. Если вы создаете переменную a локально из метода p (кстати, эти имена отстой), она отличается от переменной self.a . Пример использования вашего кода:

 class d:
    def __init__(self,arg):
        self.a = arg
    def p(self):
        a = self.a - 99
        print "my a= ", a
        print "instance a= ",self.a


x = d(1)
y = d(2)
x.p()
y.p()
  

Что дает:

 my a=  -98
instance a=  1
my a=  -97
instance a=  2
  

Наконец, вам не обязательно вызывать первую переменную self . Вы могли бы называть это как угодно, хотя на самом деле не должны. Принято определять методы и ссылаться на них self изнутри, поэтому, если вы вообще заботитесь о том, чтобы другие люди читали ваш код, не желая вас убивать, придерживайтесь соглашения!

Дальнейшее чтение:

Комментарии:

1. Хорошее объяснение, хотя вначале вводящая в заблуждение терминология: то, что мы называем связанным методом, уже имеет экземпляр (в качестве неявного первого аргумента), несвязанный метод (в Python 2 он имеет свой собственный тип; в Python 3 это просто функция, но концепция все еще существует) все еще нуждается в экземпляре (в качестве явного первого аргумента).

2. это был мой первый опубликованный вопрос. я вижу, что вопрос оценен как -1, но я не уверен, почему. это потому, что вопрос неуместен для SO? или плохо представлен? или потому, что мои ответы были не в формате?

3. @delnan: Вы не совсем правы. Если вы определите голую функцию, которая принимает self в качестве своего первого аргумента, а затем присвоите ее объекту класса, любые экземпляры этого класса унаследуют эту функцию как связанный метод. В этом случае все, что вы сделали, это создали функцию, присоединили ее к классу, и она стала методом. Однако вы правы в том, что фактическое значение type of function меняется на значение instancemethod .

4. @mike: Кому-то не понравился ваш вопрос, и он отклонил его. Обычно лучше быть более описательным в исходном вопросе, чем следовать в комментариях. 🙂

5. Как это противоречит всему, что я сказал?

Ответ №3:

Когда вы удаляете self, у вас в конечном итоге вызывается только одна переменная, a которая будет общей не только для всех ваших d объектов, но и для всей вашей среды выполнения. Вы не можете просто исключить self по этой причине.

Комментарии:

1. хорошо, теперь я вижу, что глобальный оператор поднимает переменную до уровня выполнения