#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
offunction
меняется на значениеinstancemethod
.4. @mike: Кому-то не понравился ваш вопрос, и он отклонил его. Обычно лучше быть более описательным в исходном вопросе, чем следовать в комментариях. 🙂
5. Как это противоречит всему, что я сказал?
Ответ №3:
Когда вы удаляете self, у вас в конечном итоге вызывается только одна переменная, a
которая будет общей не только для всех ваших d
объектов, но и для всей вашей среды выполнения. Вы не можете просто исключить self по этой причине.
Комментарии:
1. хорошо, теперь я вижу, что глобальный оператор поднимает переменную до уровня выполнения