Хобрук: Ваш путь к мастерству в программировании

Python OOP. Должен ли def main() находиться вне какого-либо класса в файле .py?

У меня есть вопрос, когда речь идет об ООП в целом, а также о Python в частности. Допустим, у меня есть, например, priority.py — простая программа с графическим интерфейсом для управления приоритетами, и есть три класса: Priority, Client, GuiPart:

# priorities.py
#   GUI program to manage priorities

from tkinter import *

class Priority:
    pass

class GuiPart:
    def __init__(self):
        self.root = self.createWindow()

    def createWindow(self):

        root = Tk()
        root.resizable(width = False, height = False)
        root.title("Priorities")

        return root

    def display(self):

        Label(self.root,
              text = "testes").grid(row = 0, column = 1)

class Client:
    pass

def main():
    g = GuiPart()
    g.display()
    root = g.root.mainloop()

main()

Должен ли я поместить def main() вне каких-либо классов или поместить его в класс Client?

31.03.2017

  • Я не уверен, что говорится в руководстве по стилю (или что думают другие люди), но лично я не использую def main(), я использую if __name__ == '__main__: и помещаю его в конец файла вне каких-либо классов (как вы делаете ). 31.03.2017
  • Если ваш код не работает или вы хотите повысить его эффективность, этот вопрос лучше подходит для Code Review. 31.03.2017
  • @RocketHazmat Определение main как функции также упрощает тестирование этого кода. 31.03.2017
  • @RocketHazmat def main(): и if __name__ == '__main__: не исключают друг друга. if __name__ == '__main__: main() распространено и, как сказал @chepner, упрощает тестирование main в другом месте. 31.03.2017
  • Справедливо! Я только изучаю Python, и вот как я это делаю. Может быть, мне нужно исправить, как я делаю вещи :) 31.03.2017
  • @BallpointBen Я не уверен, что полностью понимаю взаимоисключающие. Не могли бы вы описать это более словами? 31.03.2017
  • @ wraith46 Rocket Hazmat сказал, что он не использует main(), он использует if __name__. Я говорю, что это не или или; вы можете поместить все функции main в одну функцию, а затем вызвать эту функцию из if __name__ 31.03.2017
  • Спасибо @BallpointBen 31.03.2017

Ответы:


1

Каждый модуль (файл python) имеет встроенную переменную __name__, если она равна "__main__", это означает, что этот файл запускался напрямую, но если __name__ равен другим вещам, это означает, что текущий файл импортирован в другие файлы python.

если вы запускаете этот файл напрямую или как модуль, вы можете использовать переменную __name__ для распознавания типа используемого файла кода, как показано ниже:

# Some codes
if __name__ == '__main__':
    main()

Теперь пользователи могут запускать этот файл напрямую, и/или программисты могут использовать этот модуль в других кодах без запуска функции main().

31.03.2017

2

Мой предпочтительный подход:

отдельный основной файл с директивой if __name__ == '__main__':

Причины:

  1. Логика приложения и логика вызова разделены. так что вы можете легко масштабировать
  2. Может эффективно поддерживать и применять различные настройки среды. Таким образом, мы можем плавно переходить между настройками dev/test/stage/prod.
  3. Повышает читаемость кода, а также
31.03.2017
  • Извините, но я не совсем понимаю, имя — это имя чего? Из файла .py? 31.03.2017
  • это волшебное слово в python.. это будет отражать имя файла и, следовательно, когда вы напрямую запускаете файл py ex.. (xyz.py), он поймет, что это начальная точка вызова, и, следовательно, все, что написано в этом блоке, будет выполняется.. в остальное время это не будет.. больше об этом stackoverflow.com/questions/419163/what-does-if-name-main-do 31.03.2017
  • Другими словами, это способ указать код, который должен выполняться только тогда, когда скрипт выполняется как скрипт, но не когда вы импортируете его как модуль из другого скрипта (или другого модуля). Вы можете не ожидать, что ваш скрипт будет импортирован, но именно так большинство (если не все) фреймворков тестирования получают доступ к вашему коду для запуска тестов. 31.03.2017
  • @ wraith46 Не за что. Вы можете пометить ответ как принятый, если считаете, что он развеял ваши сомнения. 31.03.2017
  • Новые материалы

    Что такое структура данных?
    Структура данных хранит и извлекает данные. Все, что обеспечивает эти две функции, является структурой данных . Период. Вы можете пропустить оставшуюся часть статьи, если ответ..

    мои январские чтения по программированию
    Эрик Эллиот Программирование приложения JavaScript Эл Свейгарт «Автоматизируйте скучные вещи с помощью Python» Прогрессивное веб-приложение Google..

    Создание ассоциаций секвелизации с помощью инструмента командной строки Sequelize
    Sequelize - популярный, простой в использовании инструмент объектно-реляционного сопоставления (ORM) JavaScript, который работает с базами данных SQL. Довольно просто начать новый проект с..

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

    Введение в машинное обучение для обнаружения аномалий (часть 1)
    Тщательно созданный, тщательно спроектированный ресурс для специалистов по данным. Часть 1 Главы 03 из Руководства по машинному обучению для обнаружения аномалий Внимание! Прежде чем вы..

    Начало работы с Pulumi в Digital Ocean
    Цифровой океан (ДО) — отличная альтернатива многим другим поставщикам облачных услуг. DO предоставляет простой и понятный пользовательский интерфейс, упрощающий управление инфраструктурой и..

    #Day68 из #100days_of_coding
    Вчера был мой 68-й день кодинга. я решил один вопрос Проблема: Разбить двоичную строку на подстроки с равным количеством нулей и единиц Дана двоичная строка str длины N . Задача состоит..