Из того, что я читал/понимал, 'сам', параметр подобен 'этому'.
Это верно?
Если бы его дополнительное, что Вы сделали бы, если сам не был' передан в метод?
Да, он используется похожим образом. Обратите внимание, что это позиционный параметр, и вы можете называть его как угодно; однако существует строгое соглашение называть его self
(а не this
или что-то еще). Какой-то позиционный параметр должен присутствовать в используемом методе экземпляра; он не является необязательным.
Радость Python
В некоторой степени это правда. Методы привязаны к экземпляру объекта, частью которого они являются. Когда вы видите
def some_func (self, foo, bar)
Передача self является иногда неявной, когда вы вызываете, например:
obj.some_func (foo_val, bar_val)
Что равно (при условии, что obj
относится к классу MyClass
) к
MyClass.some_func (obj, foo_val, bar_val)
Поскольку метод привязан к obj
, заполняется аргумент self
. Это часть того, что Python четко объясняет, что это значит. В других языках this
просто появляется в области видимости, в Python есть некоторая демонстрация того, как это происходит.
Вы также можете передавать методы и передавать их вручную self
, если вы не вызываете из связанного контекста.
Документы Python делают хорошую работу :
xf = x.f
while True:
print xf()
будет продолжать печатать hello world до скончания веков.
Что именно происходит при вызове метода? Возможно, вы заметили, что x.f () был вызван> без аргумента выше, хотя в определении функции для f () указан аргумент>.Что случилось с аргументом? Конечно, Python вызывает исключение, когда функция>, которая требует аргумента, вызывается без какого-либо аргумента - даже если аргумент на самом деле> не используется ...
На самом деле, вы, возможно, уже догадались ответ: особенность методов заключается в том, что объект> передается как первый аргумент функции. В нашем примере вызов x.f ()> в точности эквивалентен MyClass.f (x). В общем случае вызов метода со списком из n аргументов> эквивалентен вызову соответствующей функции со списком аргументов, который создается> путем вставки объекта метода перед первым аргументом.
self
- это this
, просто вы должны явно передать его и явно использовать для ссылки на методы/свойства класса.
Он не является необязательным в методах класса. Вы получите TypeError
, если попытаетесь определить метод класса без хотя бы одного аргумента (т.е. параметра self
).
Однако, вы можете назвать его как-то иначе, чем self
, но я никогда не видел другого.
self
относится к объекту, для которого был вызван метод, подобно this
в C ++. Но важно, что self
- это просто соглашение , вы можете называть его как хотите и передавать экземпляры подклассов.
self
определенно похож на this
, однако в Python имя self
является просто условным обозначением, и его можно назвать как угодно еще. Переменная названа в соответствии с тем, что вы вызываете в прототипе функции ( def function (something, params ...):
).
Например, методы, действительно требуется self
. Для классовых или статических методов вам необходимо указать, что они должны рассматриваться как таковые, и тогда self
не требуется. Например:
def type_to_display(type):
"""Converts a pass type to the full written pass type."""
return list((pair[1] for pair in Pass.TYPE_CHOICES if pair[0] ==
type[0:1].upper()))[0]
type_to_display = staticmethod(type_to_display)
Вы никогда не сможете использовать метод экземпляра таким образом, чтобы self не передавался. Например, если у меня есть экземпляр my_car
Car
], и я использую метод экземпляра drive
класса Car
, экземпляр my_car
будет неявно передан в метод drive
как первый параметр ( self
).
class Car:
def drive(self):
self.do_some_stuff()
my_car = Car()
my_car.drive() # actually calls Car.drive(my_car)
В классах необходима переменная self
(или cls
для classmethods). Как ее называть - это ваше решение. При желании вы можете назвать ее this
.
Метод classmethod
- это метод, который получает class
в качестве первого аргумента вместо экземпляра. Он может быть вызван без передачи экземпляра.
Т.е. с помощью classmethod
вы можете сделать:
SomeObject.some_class_method()
в то время как обычный метод потребовал бы сделать
SomeObject().some_normal_method()
or
SomeObject.some_normal_method(instance)