Помощь с созданием Классов

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Закрыта!
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
можно как-то данные методы разбить на классы(с наследованием).
зачем? класс то не большой...
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
Сейчас только один класс Application. А уже потом идут методы, их вроде 7 штук, вот эти методы вынести в 2-3 класса
зачем? цель то какая?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
а помочь чем? почитать про классы и наследование ссылку дать?
вот например https://pythonru.com/primery/primery-raboty-s-klassami-v-python
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
Разобрался с тем, что class Test: def __init__(self,????):, как правильно инициализировать в Init?
Не могу понять, над методом к примеру делаю Class Test, затем Def __init__( и вот что тут дальше, проблема)
первый параметр self, это указатель класса на самого себя, дальше параметры для инициализации, их может и не быть
пример
Python:
class Test:
    def __init__(self, word: str):  # инициализация класса (конструктор)
        self.word = word

    def prt(self):
        print(self.word)


test = Test("asd")
test.prt()  # вывод asd
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
я не понимаю вашу цель, обычно класс делают для какого действия, чтобы он выполнял какую то свою роль, у вас же просто надо поделить, зачем делить как делить не понятно...
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
То есть не просто методы должны быть, а программа написана на классах нужно, вот так примерно, а как уже поделать данные методы на классы, не имеет значения. По этому и прошу помощи методы засунуть в классы, остальное уже сам
у вас и так есть класс...
на каждый метод по классу?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
у вас в классе методы завязаны между собой, просто так поделить не получиться, нужно переписывать весь код, если кто то захочет, возьмётся...
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
971
219
43
20
Москва
Я особо не вчитывался, может просто миксины подойдут? Выделяешь методы в отдельные классы, и наследуешься

Было:
Python:
class App:
    def __init__(self):
        pass

    def met1(self):
        pass

    def met2(self):
        pass

    def met3(self):
        pass

    def met4(self):
        pass

Стало:
Python:
class Methods1:
    def met1(self):
        pass

    def met2(self):
        pass

class Methods2:
    def met3(self):
        pass

    def met4(self):
        pass

class App(Methods1, Methods2):
    def __init__(self):
        pass
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
971
219
43
20
Москва
Попробуй сам, просто пишешь
Python:
class AnyName:
    def met(self):
        pass

И сколько надо таких классов, в них переносишь любые методы, profit!
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
971
219
43
20
Москва
Например у тебя был класс App
Python:
class App:
    def __init__(self):
        pass

    def method(self):
        pass

Создаешь новый класс, переносишь метод, наследуешься
Python:
class Methods:
    def method(self):
        pass
    
    
class App(Methods):
    def __init__(self):
        pass
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
Если я правильно понимаю, вот у меня есть методы, которые просто методы: def exit, set_text, show_data,get_data_from_db, findEncodings, которые без класса. Нужно для них создать класс и добавить их все в это класс?
Python:
def exit(self):
        """Метод для выхода из программы"""
        self.run = False
        time.sleep(.1)
        self.root.destroy()

    def set_text(self, entry, text):
        """Метод для вывода текста в поле на форме"""
        entry.delete(0, tk.END)
        entry.insert(0, text)


    def show_data(self):
        """Метод для вывода данных в форму"""

        self.set_text(self.name_entry, text=self.profile['name'])
        self.set_text(self.lastname_entry, text=self.profile['lastname'])
        self.set_text(self.status_entry, text=self.profile['status'])
        self.set_text(self.city_entry, text=self.profile['city'])
        self.set_text(self.age_entry, text=self.profile['age'])
        self.set_text(self.gender_entry, text=self.profile['gender'])

        # если у профиля есть фото
        if self.profile['photo'] is not None:
            # делаем картинку
            image = Image.open(io.BytesIO(self.profile['photo']))
            # задаем ей размер 250 на 400 пикселей
            image = image.resize([260, 400])
            # преобразуем в PhotoImage
            img_tk = ImageTk.PhotoImage(image)
            # привязываем к канве
            self.photo.image = img_tk
            # выводим
            self.photo.create_image([0, 0], image=img_tk, anchor="nw")
        else:
            # если нет фото - то не показываем
            self.photo.image = None


    def get_data_from_db(self):
        """Метод для получения данных из базы и записи в переменные класса"""

        conn = sqlite3.connect('db/last.db')
        cur = conn.cursor()
        c = cur.execute("""SELECT name, lastname, photo, status, city, age, gender FROM new_test5""")
        data = c.fetchall()
        for index, (name, lastname, photo, status, city, age, gender) in enumerate(data):
            curImg = cv2.imdecode(np.frombuffer(photo, dtype='uint8'), cv2.IMREAD_COLOR)
            self.data[index] = {'name': name,
                                'lastname': lastname,
                                'status': status,
                                'city': city,
                                'age': age,
                                'gender': gender,
                                'photo': photo
                                }
            self.images.append(curImg)

        conn.close()

        # это можно будет потом вынести в отдельный метод
        self.encodeListKnown = self.findEncodings(self.images)

        statusbar = tk.Label(root, text="Процесс загрузки данных", bd=1, relief=tk.SUNKEN, anchor=tk.W)
        statusbar.place(x=30, y=340)
        master = tk.Tk
        pb1 = ttk.Progressbar(root, orient="horizontal", mode="determinate", maximum=100, value=0)
        pb1.place(x=50, y=315)
        master.update(self)
        pb1['value'] =0
        master.update(self)
        while pb1['value']<100:
            pb1['value'] +=10
            master.update(self)
            time.sleep(0.5)
            if pb1['value'] == 100:
                mb.showinfo(message='Загрузка данных завершена, нажмите кнопку Start')


        #print("Декодирование закончено")

    def findEncodings(self, images):
        """Метод для получения списка лиц из списка картинок"""
        encodeList = []
        for img in images:
            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            encode = face_recognition.face_encodings(img)[0]
            encodeList.append(encode)
        return encodeList


if __name__ == "__main__":
    root = tk.Tk()
    root.title("Форма с данными")
    root.resizable(False, False)
    Application(root)
    root.mainloop()
что значит без класса? зачем тогда отступы у них как в классе? зачем self? вы меня запутали в конец, я умываю руки...
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
Говорю же, может я туплю и все методы относятся к одному классу Application?
так и есть
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
971
219
43
20
Москва
Может я туплю, или все методы и так относятся к классу class Application(tk.Frame):? По коду, которые прикреплен при создании темы?
Думаю да, ведь по определенью метод, это функция которая относится классу. Да и принимают они self, значит относятся к классу
 

vadimppp

Новичок
Пользователь
Сен 30, 2021
48
0
6
Спасибо за уделенное время!
 

Форум IT Специалистов