Я изучал Python, следуя некоторым руководствам по pygame .
В нем я нашел широкое использование ключевого слова self и, исходя в основном из Java, обнаружил, что все время забываю вводить self . Например, вместо self.rect.centerx
я бы напечатал rect.centerx
, потому что для меня rect уже является переменной-членом класса.
Параллель Java, о которой я могу думать в этой ситуации, заключается в том, что все ссылки на переменные-члены должны быть префиксом этого .
Я застрял в префиксе всех переменных-членов с помощью self или есть способ объявить их, что позволило бы мне избежать этого?
Даже если то, что я предлагаю, не питоническое , я все равно хотел бы знать, возможно ли это.
Я взглянул на эти связанные вопросы SO, но они не совсем отвечают на то, что мне нужно:
m_
префиксе для всех имен членов, которое наблюдается некоторыми программистами на C ++ / Java?self.
Подобным образом использование улучшает читаемость. Также вам следует прочитать dirtsimple.org/2004/12/python-is-not-java.html .m_
используется только для непубличных нестатических элементов данных (по крайней мере, в C ++).mVariableName
переменных-членов при кодировании на Java. Я думаю, что комментарий @ Anurag довольно хорошо подводит итог тому, что должен делать Java-разработчик при изучении python.Ответы:
Python требует указания self. В результате никогда не возникает путаницы в том, что является членом, а что нет, даже без видимого полного определения класса. Это приводит к полезным свойствам, таким как: вы не можете добавлять элементы, которые случайно затеняют нечленов и тем самым нарушают код.
Один крайний пример: вы можете написать класс, не зная, какие базовые классы он может иметь, и всегда знать, обращаетесь ли вы к члену или нет:
Это полный код! (some_function возвращает тип, используемый в качестве основы.)
Другой, где методы класса динамически составляются:
Помните, что оба этих примера являются экстремальными, и вы не будете видеть их каждый день, и я не предлагаю вам часто писать такой код, но они ясно показывают, что аспекты себя явно требуются.
источник
self
.__shadow__ myFieldName
. Это также предотвратит случайное затенение, не так ли?Предыдущие ответы в основном представляют собой варианты «нельзя» или «не следует». Хотя я согласен с последним мнением, технически вопрос все еще остается без ответа.
Более того, есть законные причины, по которым кто-то может захотеть сделать что-то в соответствии с тем, что задает фактический вопрос. Иногда я сталкиваюсь с длинными математическими уравнениями, в которых использование длинных имен делает уравнение неузнаваемым. Вот несколько способов сделать это в готовом примере:
Третий пример - т.е. использование
for k in self.__dict__ : exec(k+'= self.'+k)
- это в основном то, о чем на самом деле спрашивается вопрос, но позвольте мне прояснить, что я не думаю, что в целом это хорошая идея.Для получения дополнительной информации и способов перебора переменных класса или даже функций см. Ответы и обсуждение этого вопроса . Для обсуждения других способов динамического именования переменных и того, почему это обычно не очень хорошая идея, см. Это сообщение в блоге .
ОБНОВЛЕНИЕ: похоже, нет способа динамически обновлять или изменять локальные переменные в функции в Python3, поэтому calc3 и подобные варианты больше невозможны. Единственное решение, совместимое с python3, которое я могу придумать, - это использовать
globals
:Что, опять же, было бы ужасной практикой в целом.
источник
locals
вместо использованияexec
?locals().update(self.__dict__)
Python 2 и 3, но это не сработало. В python3 больше не подходит даже трюк с «exec». С другой стороны,globals().update(self.__dict__)
работает, но в целом было бы ужасной практикой.На самом деле
self
это не ключевое слово, это просто имя, условно присвоенное первому параметру методов экземпляра в Python. И этот первый параметр нельзя пропустить, так как это единственный механизм, который имеет метод, чтобы узнать, какой экземпляр вашего класса он вызывается.источник
Вы можете использовать любое имя, которое хотите, например
или даже
но вы застряли в использовании имени для области видимости.
Я не рекомендую вам использовать что-то отличное от себя, если у вас нет убедительной причины, поскольку это сделает это чуждым для опытных питонистов.
источник
self
, и вы должны следовать этому соглашению. Это упростит понимание вашего кода для любого опытного программиста на Python, который взглянет на него. (В том числе и вы, через шесть месяцев, пытаетесь выяснить, что делает ваша старая программа!)def function(_, variable): _.variable = variable
def funcion(*args): args[0].variable = args[1]
да, вы всегда должны указывать
self
, потому что явное лучше, чем неявное, согласно философии Python.Вы также обнаружите, что способ программирования на Python очень отличается от того, как вы программируете на Java, поэтому использование
self
имеет тенденцию к уменьшению, поскольку вы не проецируете все внутри объекта. Скорее, вы шире используете функции уровня модуля, которые можно лучше протестировать.Кстати. Сначала я ненавидел это, теперь ненавижу противоположное. то же самое для управления потоком с отступом.
источник
self
никоим образом не касаются . Так какой смысл иметь их в классе?«Я» - это обычный заполнитель текущего экземпляра объекта класса. Он используется, когда вы хотите обратиться к свойству объекта, полю или методу внутри класса, как если бы вы ссылались на «себя». Но чтобы сделать его короче, кто-то из области программирования Python начал использовать «self», в других областях используется «this», но они делают его как ключевое слово, которое нельзя заменить. Я скорее использовал «его» для повышения читабельности кода. Это одна из хороших вещей в Python - у вас есть свобода выбора собственного заполнителя для экземпляра объекта, кроме «self». Пример для себя:
Теперь заменим self на its:
что теперь более читабельно?
источник
s
(или какая-нибудь другая буква) вместоits
s
имеет то же значение: псевдоним экземпляра класса.its
self является частью синтаксиса python для доступа к членам объектов, поэтому я боюсь, что вы застряли на нем
источник
На самом деле вы можете воспользоваться рецептом «Неявное Я» из презентации Армина Ронахера «5 лет плохих идей» (погуглите).
Это очень умный рецепт, как и почти все от Армина Ронахера, но я не думаю, что эта идея очень привлекательна. Я думаю, что предпочел бы это явно в C # / Java.
Обновить. Ссылка на «рецепт плохой идеи»: https://speakerdeck.com/mitsuhiko/5-years-of-bad-ideas?slide=58
источник
def method(
<del> self </del>)
, ноself.variable
все же требуется для этого умного хака.Да, это утомительно. Но так ли лучше?
источник
_
имеет особое значение в оболочке Python, где хранится последнее возвращенное значение. Это безопасно, но может сбивать с толку; Я бы этого избегал.s
илиm
(чтобы имитировать C ++)От: Self Hell - Больше функций с отслеживанием состояния.
источник
__str__
и т.п.), поскольку они вызываются другим способом, чем обычные методы.Я думаю, что было бы проще и читабельнее, если бы был оператор «член» так же, как и «глобальный», чтобы вы могли сообщить интерпретатору, какие объекты являются членами класса.
источник