Python и использующий 'сам' в методах

Из того, что я читал/понимал, 'сам', параметр подобен 'этому'.

Это верно?

Если бы его дополнительное, что Вы сделали бы, если сам не был' передан в метод?

6
задан Blankman 19 July 2010 в 16:58
поделиться

6 ответов

Да, он используется похожим образом. Обратите внимание, что это позиционный параметр, и вы можете называть его как угодно; однако существует строгое соглашение называть его self (а не this или что-то еще). Какой-то позиционный параметр должен присутствовать в используемом методе экземпляра; он не является необязательным.

5
ответ дан 10 December 2019 в 00:31
поделиться

Радость 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 аргументов> эквивалентен вызову соответствующей функции со списком аргументов, который создается> путем вставки объекта метода перед первым аргументом.

3
ответ дан 10 December 2019 в 00:31
поделиться

self - это this, просто вы должны явно передать его и явно использовать для ссылки на методы/свойства класса.

Он не является необязательным в методах класса. Вы получите TypeError, если попытаетесь определить метод класса без хотя бы одного аргумента (т.е. параметра self).

Однако, вы можете назвать его как-то иначе, чем self, но я никогда не видел другого.

2
ответ дан 10 December 2019 в 00:31
поделиться

self относится к объекту, для которого был вызван метод, подобно this в C ++. Но важно, что self - это просто соглашение , вы можете называть его как хотите и передавать экземпляры подклассов.

0
ответ дан 10 December 2019 в 00:31
поделиться

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)
0
ответ дан 10 December 2019 в 00:31
поделиться

В классах необходима переменная self (или cls для classmethods). Как ее называть - это ваше решение. При желании вы можете назвать ее this.

Метод classmethod - это метод, который получает class в качестве первого аргумента вместо экземпляра. Он может быть вызван без передачи экземпляра. Т.е. с помощью classmethod вы можете сделать:

SomeObject.some_class_method()

в то время как обычный метод потребовал бы сделать

SomeObject().some_normal_method()
or
SomeObject.some_normal_method(instance)
0
ответ дан 10 December 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: