crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Python, вопрос о переменных
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Novak Дата 12.11.2010, 23:26
  Не обязательно с таким именем, но если ты попытаешься объявить вообще без параметров - вылетит исключение. Питон хочешь или не хочешь, объект передаёт, а там уже ты разбирайся :)
А исключение, что характерно, появится только при попытке использовать эту функцию
class A(object):
    def func():
        print "Oh, no"

object =A()
print 'I am alive'
object.func()

Результат:

I am alive
Traceback (most recent call last):
File "/Users/novak/git/py_koans/py_koans/python 2/koans/test.py", line 10, in <module>
object.func()
TypeError: func() takes no arguments (1 given)


При передаче лишнего параметра также вылезет исключение:
class A(object):
    def func(self):
        print "Oh, no"

object =A()
print 'I am alive'
object.func()
object.func(1)

Результат:

I am alive
Oh, no
Traceback (most recent call last):
File "/Users/novak/git/py_koans/py_koans/python 2/koans/test.py", line 11, in <module>
object.func(1)
TypeError: func() takes exactly 1 argument (2 given)
Litkevich Yuriy Дата 12.11.2010, 23:19
 
Цитата(Novak @ 13.11.2010, 3:15) *
Если это просто функция класса, то без "селфа" никак.
значит ли это, что в каждой функции класса обязан быть хотя бы один аргумент - self?
Novak Дата 12.11.2010, 23:15
  Если это просто функция класса, то без "селфа" никак. У тебя в любом случае первым параметром передаётся текущий объект.
иначе просто неоткуда такой переменной, как self взяться.
Т.е. тебе нужно добавить его в объявление
...
    def mouseMoveEvent(self, event):
...
Litkevich Yuriy Дата 12.11.2010, 23:04
  так-так, тогда получается, что я не правильно портирую:
    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_* - члены класса
Novak Дата 12.11.2010, 22:58
  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

Результаты:

3


Потому рекомендуется все используемые поля без крайней необходимости объявлять сразу явно, или в теле класса, или в конструкторе-функции __init__

Да, не забывай, что в питоне все переменные - ссылки на объекты. Потому и можно ими так легко играться.
Litkevich Yuriy Дата 12.11.2010, 22:41
  я смотрел описание класса, там в одной функции использовались переменные и так и так.
но, те которые были без self, они как локальные в Си++ (например, создание компоновщиков, которые в других местах не нужны).
А те, что с self использовались и в других функциях класса.


Ещё вызывает запарку сама динамическая типизация.
Если мне нужна переменная-член класса, то нужно просто написать
self.var = ...

и всё? Т.е. self сделает своё дело, да?
Novak Дата 12.11.2010, 22:30
  Первое - это переменная, вторая - по сути поле, тоже переменная, у другого объекта. На самом деле происходит поиск атрибута "myvar" у объекта "self"
В питоне в фукнции у класса первым параметром передаётся переменная-объект, аналог this в плюсах
Принято, что первый параметр у такой функции называется self
Потому вторую запись чаще всего можно встретить в определении класса:
class MyClass:
    def print_message(self, message):
        print "Message: %s"%message
Litkevich Yuriy Дата 12.11.2010, 15:21
  чем отличаются две переменные, к которым присваивание осуществляется так:
myvar = ...
self.myvar = ...

может быть первая локальная, а вторая член класса?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 22:27