Форум программистов, компьютерный форум CyberForum.ru Форум программистов | Компьютерный форум | Форум web-программистов | Форум по электронике и бытовой технике | Форум о софте | Научный форум | Карьера и бизнес
CyberForum.ru - форум программистов и сисадминов > >
Восстановить пароль Регистрация

Ответ Создать новую тему
 
Oleg Gorjajnov
Новичок
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 3
28.07.2013, 17:31     Как обращаться к переменным внутри класса из его методов?
  #1
Только начинаю осваивать ооп и наткнулся на проблему, ответ на которую не смог найти, гугля несколько часов.
Есть такой чисто тестовый код, использующий парадигму ооп:

Код Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#coding:utf-8
import math
 
class QuadraticEquation(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c
    
    def solve_quad_eq(self):
        D = self.b**2-4*self.a*self.c
        if D > 0:
            x1 = -self.b-math.sqrt(D)/2*self.a
            x2 = -self.b+math.sqrt(D)/2*self.a
            print "Первый корень: %.2f, второй корень: %.2f" % (x1, x2)
        elif D == 0:
            x12 = -(self.b/2*self.a)
            print "x1=x2=%.2f" % (x12)
        else:
            print "Корней нет"
            exit()
В начале класса вызывается конструктор __init__, который принимает четыре аргумента и присваивает их соответствующим переменным. И вопрос (возможно очень тупой):
то есть надо внутри класса обращаться к переданным переменным, как self.variable (то есть через self.)?
Правильно ли у меня тут это реализовано?
AdAgent
Объявления
28.07.2013, 17:31
dhxdzjbr
Форумчанин
94 / 79 / 2
Регистрация: 06.05.2013
Сообщений: 241
28.07.2013, 18:23
  #2
self означает, что перменная становится атрибутом экземпляра класса. Вообще тонкости языка и вообще все подробности описанны в книгах, а в сети чаще всего лежат поверхостные мануалы.

Если есть ещё вопросы, пиши, постараюсь ответить.
helter
Форумчанин
1597 / 1210 / 89
Регистрация: 12.03.2013
Сообщений: 2,035
29.07.2013, 00:10
  #3
Цитата Сообщение от Oleg Gorjajnov Посмотреть сообщение
то есть надо внутри класса обращаться к переданным переменным, как self.variable (то есть через self.)?
В принципе, нет. self - просто имя переменной (хотя в данном контексте стандартное).

Метод есть функция. Однако смысл метода состоит в том, что он непременно должен знать, какой именно объект его вызывает. Например, для объекта QuadraticEquation(1, 2, 3) метод solve_quad_eq должен вернуть один результат, а для объекта QuadraticEquation(1, 2, -3) - другой. Естественный способ для функции знать что-либо - это получить эту вещь в качестве аргумента. Таким образом, метод должен получать вызвавший его объект в качестве аргумента. Иначе это не метод, а чёрт знает что. В питоне это сделано максимально прозрачно: при определении метода вызвавший объект передаётся как первый аргумент. Традиционно он называется self, и этой традиции стоит следовать, хотя она не отражает требований языка. В ваших методах: в __init__ происходит инициализация полей вызвавшего объекта, в solve_quad_eq на основании полей вызвавшего объекта осуществляются вычисления.

Как любитель лиспа посоветовал бы вам сделать один метод для вычисления корней (он может возвращать, например, список) и другой - для вывода.
dhxdzjbr
Форумчанин
94 / 79 / 2
Регистрация: 06.05.2013
Сообщений: 241
29.07.2013, 20:21     Как обращаться к переменным внутри класса из его методов?
  #4
Цитата Сообщение от Oleg Gorjajnov Посмотреть сообщение
то есть надо внутри класса обращаться к переданным переменным, как self.variable (то есть через self.)?
Методам недоступна локальная область видимости класса - им доступны только области видимости вмещающих функций. Именно по этой причине методы должны использовать аргумент self с экземпляром или имя
класса, чтобы вызывать другие методы или обращаться к другим атрибутам, определенным во вмещающей инструкции class.
Yandex
Объявления
29.07.2013, 20:21
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Раздел Автор Дата
Python Как из строки присваивать значение переменным
Доброе время суток. Есть строка считанная из текстового поля: (4239;3786)(4239;5254)(4239;1275)(4239;2743)(4239;4211)(4239;232)Необходимо, каждое первое число(оно все время постоянное) присваивать...
Python hrH 15.05.2014 20:10
C++ Qt Как получить доступ к переменным одного класса из методов другого
Есть класс MainWindow с переменными в pablic, и кьютешный QGraphicsView. Нужно вот тут void QGraphicsView::mouseMoveEvent(QMouseEvent* event) { } проверить значение переменной из MainWindow. Как...
Qt The_Prophet 16.02.2014 16:13
Python Как записать объект класса в файл?
Добрый день! Подскажите пожалуйста, объект класса можно целиком записать в файл? У меня выводится только что-то вроде По частям записать получается, но это очень неудобно. Вот сам...
Python Apiaceae 07.02.2014 20:53
C++ обращение к переменным одного метода из другого внутри класса
Доброго времени суток. Поставлена задача написать программу реализующую матрицу и поостые арифметические действия, определение детерменанта и решенеие слау 2 способами посредством классов. В одном...
С++ для начинающих na6tena 03.12.2013 16:13
Python Как вывести список файлов внутри вложенных папок?
Здравствуйте. Пытаюсь изучать питон и ооп в целом. Задача: вывести список файлов внутри вложенных папок. Получилось к сожалению только вывести полный список файлов. Помогите плиз. import os ...
Python Samokhiniu 26.06.2013 11:31
PHP ООП доступ к переменным внутри класса
чем отличается доступ к объявленной переменной внутри класса указателем $thes->, от доступа к не объявленной переменной? пример: 1.... public $a;//переменная объявлена public function...
PHP и ООП Веди 26.11.2012 23:22
Python Python 3.2: как правильно обращаться с типом Decimal
Новичок в питоне. У меня версия 3.2. Не могу разобраться, почему вот так получается: >>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3') Decimal('0.0') >>> Decimal(0.1) +...
Python Kifsif 19.09.2012 08:37
Python Вызов класса как функции
У меня есть класс, который содержит несколько методов, однако открытых методов нет. Мне нужно чтобы класс вызвался как функция, типа foo('some') и возвращал строку. Сначала сделал так: #file...
Python dscoma 19.02.2012 12:14
Опции темы

Текущее время: 15:32. Часовой пояс GMT +4.

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.