Я изучал Python следующим некоторые pygame учебные руководства.
Там я нашел широкое применение ключевого слова сам, и прибывающий из, прежде всего, фон Java, я нахожу, что продолжаю забывать вводить сам. Например, вместо self.rect.centerx
Я ввел бы rect.centerx
, потому что, мне, реагируют уже, членская переменная класса.
Параллель Java, о которой я могу думать для этой ситуации, должна снабдить префиксом все ссылки на членские переменные с этим.
Застревают я снабжающий префиксом все членские переменные сам или там способ объявить их, которые позволили бы мне избегать необходимости делать так?
Даже если то, что я предлагаю, не является pythonic, я все еще хотел бы знать, возможно ли это.
Я смотрел на них связанные ТАК вопросы, но они не вполне отвечают, что я после:
Python требует указать себя. В результате никогда не возникает путаницы в том, что является членом, а что нет, даже если не видно полного определения класса. Это приводит к таким полезным свойствам, как: нельзя добавлять члены, которые случайно тенеют нечленами и тем самым ломают код.
Один крайний пример: можно написать класс, не зная, какие в нем могут быть базовые классы, и всегда знать, имеете ли вы доступ к члену или нет:
class A(some_function()):
def f(self):
self.member = 42
self.method()
Это полный код! (some_function возвращает тип, используемый в качестве базового)
Другой, где методы класса написаны динамически:
class B(object):
pass
print B()
# <__main__.B object at 0xb7e4082c>
def B_init(self):
self.answer = 42
def B_str(self):
return "<The answer is %s.>" % self.answer
# notice these functions require no knowledge of the actual class
# how hard are they to read and realize that "members" are used?
B.__init__ = B_init
B.__str__ = B_str
print B()
# <The answer is 42.>
Запомните, оба этих примера экстремальны, и вы не увидите их каждый день, и я не предлагаю часто писать код подобного рода, но в них четко видны аспекты явной необходимости в себе.
.На самом деле self
- это не ключевое слово, это просто название, условно даваемое первому параметру методов экземпляров на языке Python. И этот первый параметр пропустить нельзя, так как это единственный механизм, которым обладает метод, знающий, к какому экземпляру вашего класса он обращается.
Вы можете использовать любое имя, например
class test(object):
def function(this, variable):
this.variable = variable
или даже
class test(object):
def function(s, variable):
s.variable = variable
, но вы застряли с использованием имени для области видимости.
Я не рекомендую вам использовать что-то отличное от себя, если только у вас нет убедительной причины, так как это сделает его чужим для опытных питонистов.
self является частью синтаксиса питонов для доступа к членам объектов, так что, боюсь, вы застряли с этим
. да, вы всегда должны указывать self
, потому что явное лучше, чем неявное, согласно философии Python.
Вы также обнаружите, что способ программирования на python сильно отличается от способа программирования на java, поэтому использование self
имеет тенденцию к уменьшению, поскольку вы не проецируете все внутри объекта. . Скорее, вы шире используете функции уровня модуля, которые можно лучше протестировать.
между прочим. Сначала я ненавидел это, теперь я ненавижу противоположное. то же самое для управления потоком с отступом.