Найти - Пользователи
Полная версия: О классах, функция и т.д.
Начало » Python для новичков » О классах, функция и т.д.
1 2
white
Продолжу задавать глупые вопросы.
Посмотрел и прочитал информацию. Там везде применяют один пример, как будто кто то один его написал а остальные скопировали.
Поясните мне
 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 и только потом появляется окно. Так вот, можно как нибудь уйти от этого?
Egorro13
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. Если их не загружать (например, поместить объявление классов после основного тела), то сообщения выводиться не будут, но и кнопки не создадутся (не найдут, что за команды должны выполняться)
white
Egorro13
1. Как вариант, можно сделать статический метод:
А если в классе две или больше функции, как передать данные из одной функции в другую внутри одного класса?
Egorro13
white
А если в классе две или больше функции, как передать данные из одной функции в другую внутри одного класса?
Обычно для таких целей используются поля объекта/класса, или можно передавать значения в параметрах функций/методов
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()

почему не запускается?
Как вы вообще в этом разбираетесь?
marvellik
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
>>>
все запускается
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()

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

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

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

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

Мой странный ум говорит что должно работать:
 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. там мы грубо говоря скопировали часть кода с верху. И перестало работать.

Где то я конкретно туплю)
Egorro13
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 будет бесконечно вызывать сам себя, пока стек не переполнится
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB