Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 27, 2019 09:40:18

white
Зарегистрирован: 2018-11-28
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

О классах, функция и т.д.

Продолжу задавать глупые вопросы.
Посмотрел и прочитал информацию. Там везде применяют один пример, как будто кто то один его написал а остальные скопировали.
Поясните мне

 from tkinter import *
from tkinter import messagebox
class low():
    U=0.4
    print(U)
    def w():
        w=0.4*5
        print(w)
class hi():
    U=10
    print(U)
    def a():
        w=U
        print(w)
root = Tk()
root.geometry('150x150+0+0')
root.title('')
btn1 = Button(root, text="", font=("Ubunte", 10), command = low.w)
btn1.grid(row=1, column=0, sticky="ew")
btn2 = Button(root, text="", font=("Ubunte", 10), command = hi.a)
btn2.grid(row=1, column=1, sticky="ew")
root.mainloop()
Суть такая:
1. как передать значение U из класcа hi в функцию a? global U мне не нравится?
2. При запуске программы командная строка пишет 0,4 10 это показывает что выполняется класс low потом hi и только потом появляется окно. Так вот, можно как нибудь уйти от этого?

Офлайн

#2 Апрель 27, 2019 10:26:39

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

О классах, функция и т.д.

white
Суть такая:
1. как передать значение U из класcа hi в функцию a? global U мне не нравится?
2. При запуске программы командная строка пишет 0,4 10 это показывает что выполняется класс low потом hi и только потом появляется окно. Так вот, можно как нибудь уйти от этого?
1. Как вариант, можно сделать статический метод:
     @staticmethod
    def a():
        w = hi.U
        print(w)
2. Классы в любом случае загружаются перед основным телом: как я понимаю, при этом создаются соответствующие объекты low и hi. Если их не загружать (например, поместить объявление классов после основного тела), то сообщения выводиться не будут, но и кнопки не создадутся (не найдут, что за команды должны выполняться)

Офлайн

#3 Апрель 27, 2019 12:43:47

white
Зарегистрирован: 2018-11-28
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

О классах, функция и т.д.

Egorro13
1. Как вариант, можно сделать статический метод:
А если в классе две или больше функции, как передать данные из одной функции в другую внутри одного класса?

Офлайн

#4 Апрель 27, 2019 14:26:39

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

О классах, функция и т.д.

white
А если в классе две или больше функции, как передать данные из одной функции в другую внутри одного класса?
Обычно для таких целей используются поля объекта/класса, или можно передавать значения в параметрах функций/методов

Офлайн

#5 Апрель 28, 2019 07:51:35

white
Зарегистрирован: 2018-11-28
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

О классах, функция и т.д.

 class MyClass:
    def __init__(self,x,y,z):
    self.x=x
    self.y=y
    self.z=z
    def calc_method(self):
    return (self.x + self.y/self.z)
    def printing_calc_result(self):
    print (self.calc_method() )
root = MyClass(150,60,40)
root.printing_calc_result()

почему не запускается?
Как вы вообще в этом разбираетесь?

Офлайн

#6 Апрель 28, 2019 08:40:49

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

О классах, функция и т.д.

white
почему не запускается?
может дело в отступах?

 class MyClass:
    def __init__(self,x,y,z):
        self.x=x
        self.y=y
        self.z=z
        
    def calc_method(self):
        return (self.x + self.y/self.z)
    
    def printing_calc_result(self):
        print (self.calc_method() )
        
root = MyClass(150,60,40)
root.printing_calc_result()
===
151.5
>>>
все запускается

Офлайн

#7 Апрель 28, 2019 09:49:49

white
Зарегистрирован: 2018-11-28
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

О классах, функция и т.д.

  class MyClass:
    def __init__(self,x,y,z):
        self.x=x
        self.y=y
        self.z=z
        
    def calc_method(self):
        return (self.x + self.y/self.z)
    
    def printing_calc_result(self):
        print (self.calc_method() )
        
root = MyClass(150,60,40)
root.printing_calc_result()

помогите понять
root это просто переменная?
зачем она добавлена в строку root.printing_calc_result()?

в моем понимание если бы мы написали бы printing_calc_result() (вызвали функцию), то по идее должно работать, но нет.

объясните находчиво self какую суть несет это слово. В инете воду льют а конкретно нет объяснения. Ну или я не понимаю

Жаль тут нет смайлика который головой бьется об стену….

Отредактировано white (Апрель 28, 2019 09:54:40)

Офлайн

#8 Апрель 28, 2019 09:55:11

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

О классах, функция и т.д.

printing_calc_result() - метод, объявленный в классе MyClass, root - переменная этого класса. self - объект (переменная класса), у которой метод класса вызван, в случае root.printing_calc_result() self будет ссылаться на root

Офлайн

#9 Апрель 28, 2019 10:20:45

white
Зарегистрирован: 2018-11-28
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

О классах, функция и т.д.

Ок, и последнее что хочу узнать на сегодня). (и так есть над чем подумать)

Мой странный ум говорит что должно работать:

 from tkinter import *
def low():
    root = low(1,2,3,4)
    class low:
        def __init__(self,x,y,z,f):
            self.f=f
            self.x=x
            self.y=y
            self.z=z     
        def calc_method(self):
            return (self.x + self.y/self.z+self.f)
        def printing_calc_result(self):
            print (self.calc_method() )
def hi():
    root = hi(5,6,7,8)
    class hi:
        def __init__(self,x,y,z,f):
            self.f=f
            self.x=x
            self.y=y
            self.z=z
        def calc_method(self):
            return (self.x + self.y/self.z+self.f)
        def printing_calc_result(self):
            print (self.calc_method() )
root = Tk()
root.geometry('150x150+0+0') #размер окна и координаты
btn1 = Button(root, text="1", font=("Ubunte", 10), command=low)
btn1.grid(row=0, column=0, sticky="ew")
btn2 = Button(root, text="2", font=("Ubunte", 10), command=hi)
btn2.grid(row=1, column=0, sticky="ew")
root.mainloop()

Вроде логика железная:
Создаем окно, 2 кнопки 1 и 2. при нажатие на 1 уходит на функцию low. там мы грубо говоря скопировали часть кода с верху. И перестало работать.

Где то я конкретно туплю)

Офлайн

#10 Апрель 28, 2019 10:33:33

Egorro13
Зарегистрирован: 2019-04-16
Сообщения: 105
Репутация: +  5  -
Профиль  

О классах, функция и т.д.

white
Создаем окно, 2 кнопки 1 и 2. при нажатие на 1 уходит на функцию low. там мы грубо говоря скопировали часть кода с верху. И перестало работать.
 def low():  # объявление метода low()
    root = low(1, 2, 3, 4)  # объявление переменной root, присвоение ей
                            # ссылки на новый объект ЕЩЕ НЕ ОБЪЯВЛЕННОГО класса low.
    class low: # объявление вложенного класса low, методы класса 
               # сами по себе ничего не делают - для этого их надо вызывать.
Да еще и если вложенный класс назвать не low, то в строке root = low(1, 2, 3, 4) метод low будет бесконечно вызывать сам себя, пока стек не переполнится

Отредактировано Egorro13 (Апрель 28, 2019 10:45:51)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version