чем отличаются две переменные, к которым присваивание осуществляется так:
myvar = ...
self.myvar = ...
может быть первая локальная, а вторая член класса?
Первое - это переменная, вторая - по сути поле, тоже переменная, у другого объекта. На самом деле происходит поиск атрибута "myvar" у объекта "self"
В питоне в фукнции у класса первым параметром передаётся переменная-объект, аналог this в плюсах
Принято, что первый параметр у такой функции называется self
Потому вторую запись чаще всего можно встретить в определении класса:
class MyClass:
def print_message(self, message):
print "Message: %s"%message
я смотрел описание класса, там в одной функции использовались переменные и так и так.
но, те которые были без self, они как локальные в Си++ (например, создание компоновщиков, которые в других местах не нужны).
А те, что с self использовались и в других функциях класса.
Ещё вызывает запарку сама динамическая типизация.
Если мне нужна переменная-член класса, то нужно просто написать
self.var = ...
self - это просто переменная. в функциях класса она ссылается на объект, т.е. это не какое-то ключевое слово.
Другими словами, в функцию класса передаётся объект параметром, явно.
Через эту переменную можно получить доступ к полям объекта.
Область видимости этой переменной такая же, как и у всех, объявленных внутри текущей фукнции - это сама функция.
В рамках класса можно сделать вот так:
class A(object):
def func1(self):
var1 = 3 # здесь var1 и self - по сути, одинковые переменные. var1 ссылается на объект типа Int, self - на объект типа A
self.val = var1 # тут мы полю val объекта типа A присваиваем значение переменной va1
def func2(notself):
print notself.val # тут у нас просто переменная, можно сказать, локальная, которая ссылается на объет типа A
object1 = A()
object1.func1() # вызываем сначала первую фукнцию, у объекта переменной object1 появляется поле val
object1.func2() # а тут выводится значение этого поля
# будем вызвать наоборот - получим ошибку, что у объекта нет атрибута val
object2 = A()
try:
object2.func2() # у объекта пока нет поля val
except Exception as e:
print e
так-так, тогда получается, что я не правильно портирую:
def mouseMoveEvent(event):
if not self.m_embedded and (event.buttons() & Qt.LeftButton):
move(pos() + event.globalPos() - self.m_dragPosition);
self.m_dragPosition = event.globalPos();
event.accept();
здесь я в функции писал только один входной аргумент (как и было в Си++), тогда получается self-а нет?void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if (!m_embedded && (event->buttons() & Qt::LeftButton)) {
move(pos() + event->globalPos() - m_dragPosition);
m_dragPosition = event->globalPos();
event->accept();
}
}
здесь переменные m_* - члены класса
Если это просто функция класса, то без "селфа" никак. У тебя в любом случае первым параметром передаётся текущий объект.
иначе просто неоткуда такой переменной, как self взяться.
Т.е. тебе нужно добавить его в объявление
...
def mouseMoveEvent(self, event):
...
Не обязательно с таким именем, но если ты попытаешься объявить вообще без параметров - вылетит исключение. Питон хочешь или не хочешь, объект передаёт, а там уже ты разбирайся
А исключение, что характерно, появится только при попытке использовать эту функцию
class A(object):
def func():
print "Oh, no"
object =A()
print 'I am alive'
object.func()
class A(object):
def func(self):
print "Oh, no"
object =A()
print 'I am alive'
object.func()
object.func(1)
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)