Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 10, 2015 11:19:51

eleks
Зарегистрирован: 2014-08-14
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

PCAN-USB подключение

Огромное спасибо за объяснение. К сожалению, проблемы с сложившимися стереотипами продолжают блокировать процесс понимания этого простого и удобочитаемого языка. В данный момент пытаюсь постичь магию использования классов, хотябы на примере

class TimerRepeater(object):
из приведённого примера кода. Просто решил, что раз он самый короткий, значит самый простой (возможно не прав).
На данный момент понял (возможно что-то понял неверно), что классы являются объектами, которые могут содержать какие-то переменные (атрибуты) и какие-то функции (методы).
Чтобы использовать класс необходимо создать экземпляр класса, который, по сути, является простой ссылкой на класс. Методы внутри класса могут получить доступ к атрибутам внутри своего класса через экземпляр класса, который стоит первым в списке параметров метода и обычно называется как self.
Пытаюсь найти внешнее обращение к рассматриваемому классу TimerRepeater .
Для этого класса создаются два экземпляра внутри класса PCANBasicExample.
Это экземпляры:
        self.tmrRead = TimerRepeater("tmrRead", 0.050, self.tmrRead_Tick)
        self.tmrDisplay = TimerRepeater("tmrDisplay", 0.100, self.tmrDisplay_Tick)
Функция __init__ не вызывается.
Функция _run вызывается функцией start внутри класса.
Похоже эти функции испльзуются только внутри класса.
Функция start вызывается из класса PCANBasicExample.
Функция stop также вызывается из класса PCANBasicExample.




Офлайн

#2 Сен. 10, 2015 16:54:50

eleks
Зарегистрирован: 2014-08-14
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

PCAN-USB подключение

Вынужден был отлучится и поэтому не завершил своё предыдущее сообщение.
В принципе какие-то общие механизмы потихоньку становятся понятными. Однако с полным пониманием пока проблемы. Похоже подход был сделан не с той стороны. Проще начать с начала.
И так, наша программа запущена как программа, а не загружена как библиотека. Следовательно, запускается функция RunMain(root), где root = Tix.Tk().

def RunMain(root):
    global basicExl
    # Создать PCAN-Basic приложение
    #
    basicExl = PCANBasicExample(root)
    
    # Запустить приложение / старт цикла
    #
    basicExl.loop()
    
    # Уничтожение приложения / стоп цикла
    #
    basicExl.destroy()
В функции RunMain создается глобальная переменная basicExl в которую записывается экземпляр класса PCANBasicExample, наследующий библиотеку Tix.Tk(). Не совсем понятно такое наследование, т.к. библиотека Tix и без этого уже импортирована. :-/
Далее, в стр.291, запускаем функцию loop из класса PCANBasicExample (через экземпляр класса). В стр.295 обнаруживаем условие цикла
while self.exit < 0:
Где контролируется отрицательное значение параметра exit класса PCANBasicExample. Однако этот класс не имеет такого параметра. :-/
Или это не параметр PCANBasicExample?

Офлайн

#3 Сен. 10, 2015 17:04:19

J.R.
Зарегистрирован: 2015-07-18
Сообщения: 147
Репутация: +  16  -
Профиль  

PCAN-USB подключение

.

Отредактировано J.R. (Янв. 27, 2016 08:57:06)

Офлайн

#4 Сен. 11, 2015 10:27:54

eleks
Зарегистрирован: 2014-08-14
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

PCAN-USB подключение

J.R.
У PCANBasicExample есть метод:def InitializeBasicComponents(self):

И вызов этого метода есть в дандерините этого класса:
Спасибо за разъяснения!
С дандеринитом (Constructor) немножко разобрался, потихоньку втягиваюсь в атмосферу ООП, но пока возникают вопросы касательно создания атрибутов конструктором.
def __init__(self, parent):
    # Родительская конфигурация       
    self.m_Parent = parent
    self.m_Parent.wm_title("PCAN-Basic Example")
    self.m_Parent.resizable(False,False)
    self.m_Parent.protocol("WM_DELETE_WINDOW",self.Form_OnClosing)
               
    # Конфигурация кадра
    self.m_Frame =Frame(self.m_Parent)
    self.m_Frame.grid(row=0, column=0, padx=5, pady=2, sticky="nwes")
    # Конфигурация примера
    self.InitializeBasicComponents()
    self.CenterTheWindow()
    self.InitializeWidgets()
    self.ConfigureLogFile()
    self.SetConnectionStatus(False)
Проблемы с самого начала.

# Родительская конфигурация:
Что происходит при создании этого атрибута self.m_Parent = parent? Создается экземпляр из параметра, который в свою очередь является экземпляром библиотеки Tix.Tk()?
basicExl = PCANBasicExample(root) # где  root = Tix.Tk()
И что представляет из себя следующий атрибут self.m_Parent.wm_title(“PCAN-Basic Example”)? Это какая-то переменная или вызов функции из библиотеки Tix.Tk()?
Аналогичный вопрос с атрибутами self.m_Parent.resizable(False,False) и self.m_Parent.protocol(“WM_DELETE_WINDOW”,self.Form_OnClosing).

# Конфигурация кадра:
self.m_Frame =Frame(self.m_Parent)
Атрибут self.m_Frame является переменной. А что понимать под значением Frame(self.m_Parent)? Это какая-то функция? Атрибут self.m_Frame.grid(row=0, column=0, padx=5, pady=2, sticky=“nwes”) выглядит как обращение к функции.

# Конфигурация примера:
Здесь вроде бы всё ясно - вызывается ряд функций из собственного класса.

Отредактировано eleks (Сен. 11, 2015 10:33:38)

Офлайн

#5 Сен. 11, 2015 14:36:00

eleks
Зарегистрирован: 2014-08-14
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

PCAN-USB подключение

eleks
И что представляет из себя следующий атрибут self.m_Parent.wm_title(“PCAN-Basic Example”)? Это какая-то переменная или вызов функции из библиотеки Tix.Tk()?Аналогичный вопрос с атрибутами self.m_Parent.resizable(False,False) и self.m_Parent.protocol(“WM_DELETE_WINDOW”,self.Form_OnClosing).
В принципе нашел одноимённые функции wm_title, resizable, protocol в подклассе Tk. Однако, в качестве класса указан Wm, а мне нужен Tix.Tk(). Да, помощь сейчас была бы очень уместна, но форумчане, к сожалению, похоже потеряли к моей проблеме интерес

Отредактировано eleks (Сен. 11, 2015 14:36:49)

Офлайн

#6 Сен. 12, 2015 03:15:13

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

PCAN-USB подключение

eleks
Да, помощь сейчас была бы очень уместна
Возьми какую-нибудь книжку по питону для самых маленьких. А то ты пытаешься разобраться в устройстве космического корабля, задавая вопросы о том, как держать молоток, что такое гвозь и чем он отличается от шурупа.

eleks
Что происходит при создании этого атрибута self.m_Parent = parent? Создается экземпляр из параметра, который в свою очередь является экземпляром библиотеки Tix.Tk()?
Есть класс, есть экземпляр класса, есть объект и есть имя, привязанное к объекту. Вот эти понятия элементарные.

В записи
self.m_Parent = parent
self, m_Parent и parent - это имена, привязанные к объектам по их адресам в памяти.
self и parent уже есть в пространстве имён метода.
m_Parent создаётся в пространстве имён объекта, получаемого через имя self.

Вот пример:
>>> class A:
...     def f(self):
...         self.x = 1
... 
>>> a = A()
>>> a.f()
>>> a.x
1
>>>
Определяется класс A с методом f, создаётся экземпляр a класса A и у экземпляра a класса A вызывается метод f.
Когда у экземпляра вызывается метод, сам экземпляр неявно передаётся в этот метод первым аргументом.
self - это имя, которое привязывается к объекту, который передаётся первым аргументом в метод. И так как туда передаётся сам экземпляр (его адрес в памяти), у которого этот метод вызван, то self привязывается к этому адресу.
Таким образом через self ты можешь обращаться к экземпляру.

Вот это всё подробно расписано в книгах по питону, поэтому нет смысла писать здесь всё то, что уже описано десять раз в лучшем виде.



Отредактировано py.user.next (Сен. 12, 2015 03:18:02)

Офлайн

#7 Сен. 15, 2015 12:40:44

eleks
Зарегистрирован: 2014-08-14
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

PCAN-USB подключение

py.user.next
Вот это всё подробно расписано в книгах по питону, поэтому нет смысла писать здесь всё то, что уже описано десять раз в лучшем виде.
Тоже ума не приложу. И зачем только эти форумы нужны, когда столько книжек разных есть?
Ладно, продолжу пока молотком махать. У каждого свой путь к пониманию. Кому не влом, могут что-то подсказать, не делая одолжения.
Привожу выдержку из интересуемой конструкции
class PCANBasicExample(object):
    def __init__(self, parent):
        self.m_Parent = parent
...
def RunMain(root):
    global basicExl
    basicExl = PCANBasicExample(root)
...
root = Tix.Tk()
RunMain(root)
...
и список детских вопросов:
1. Понятно, что self.m_Parent атрибут класса. Имеет ли значение вложенность этого атрибута (принадлежность определённой функции)? Или же к этому атрибуту я могу обращаться из любой функции внутри класса?
2. Что передаётся через параметр parent в функцию def __init__(self, parent)? Экземпляр метода Tix.Tk()?
3. Где можно почерпнуть информацию о Tix.Tk()?

Отредактировано eleks (Сен. 15, 2015 12:42:16)

Офлайн

#8 Сен. 15, 2015 12:55:14

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

PCAN-USB подключение

Даже не смешно.

>>> Tix.Tk()
<Tix.Tk instance at 0x028C43F0>
>>> Tix.Tk
<class Tix.Tk at 0x0296DED8>
>>> help(Tix.Tk)
Help on class Tk in module Tix:

class Tk(Tkinter.Tk, tixCommand)
| Toplevel widget of Tix which represents mostly the main window
| of an application. It has an associated Tcl interpreter.
|
. . .

Офлайн

#9 Сен. 15, 2015 12:56:23

i.slepov
Зарегистрирован: 2015-05-28
Сообщения: 53
Репутация: +  5  -
Профиль   Отправить e-mail  

PCAN-USB подключение

eleks
и список детских вопросов

eleks, гораздо проще открыть python-консоль и проверить всё свои гипотезы.
А еще лучше воспользоваться оболочками с различными вспомогательными функциями, например bpython, ipython, ptpython, dreampie и т.п.

eleks
1. Понятно, что self.m_Parent атрибут класса. Имеет ли значение вложенность этого атрибута (принадлежность определённой функции)? Или же к этому атрибуту я могу обращаться из любой функции внутри класса?

И да и нет. Если стоит self, то можете из любого места. Но правила хорошего кода говорят, что атрибуты лучше определять в “конструкторе”.

eleks
2. Что передаётся через параметр parent в функцию def __init__(self, parent)? Экземпляр метода Tix.Tk()?

Вам уже ответили выше.

eleks
3. Где можно почерпнуть информацию о Tix.Tk()?

Операторы help, dir, команда pydoc, интернет…

Отредактировано i.slepov (Сен. 15, 2015 14:27:22)

Офлайн

#10 Сен. 15, 2015 13:22:58

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

PCAN-USB подключение

eleks
Тоже ума не приложу. И зачем только эти форумы нужны, когда столько книжек разных есть?
Форумы нужны, чтобы отвечать на вопросы, которых нет в книгах.
А когда задают вопросы “сколько будет дважды два”, это вызывает подозрение.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version