Как проверить или имитировать содержимое «if __name__ == '__main__'»

Мне нравится Система Объекта языка Common LISP (CLOS) и мультиметоды.

Большинство, если не все, языки объектно-ориентированного программирования имеют основные понятия классов и методов. Следующий отрывок в Python определяет классы PeelingTool и Овощ (что-то подобное Шаблону "посетитель"):

class PeelingTool:
    """I'm used to peel things. Mostly fruit, but anything peelable goes."""
    def peel(self, veggie):
        veggie.get_peeled(self)

class Veggie:
    """I'm a defenseless Veggie. I obey the get_peeled protocol
    used by the PeelingTool"""
    def get_peeled(self, tool):
        pass

class FingerTool(PeelingTool):
  ...

class KnifeTool(PeelingTool):
  ...

class Banana(Veggie):
    def get_peeled(self, tool):
        if type(tool) == FingerTool:
            self.hold_and_peel(tool)
        elif type(tool) == KnifeTool:
            self.cut_in_half(tool)

Вы помещаете peel метод в PeelingTool и имеете Банан, принимают его. Но, это должно принадлежать классу PeelingTool, таким образом, это может только использоваться, если у Вас есть экземпляр класса PeelingTool.

Версия системы Объекта языка Common LISP:

(defclass peeling-tool () ())
(defclass knife-tool (peeling-tool) ())
(defclass finger-tool (peeling-tool) ())

(defclass veggie () ())
(defclass banana (veggie) ())

(defgeneric peel (veggie tool)
  (:documentation "I peel veggies, or actually anything that wants to be peeled"))

;; It might be possible to peel any object using any tool,
;; but I have no idea how. Left as an exercise for the reader
(defmethod peel (veggie tool)
   ...)

;; Bananas are easy to peel with our fingers!
(defmethod peel ((veggie banana) (tool finger-tool))
  (with-hands (left-hand right-hand) *me*
    (hold-object left-hand banana)
    (peel-with-fingers right-hand tool banana)))

;; Slightly different using a knife
(defmethod peel ((veggie banana) (tool knife-tool))
  (with-hands (left-hand right-hand) *me*
    (hold-object left-hand banana)
    (cut-in-half tool banana)))

Что-либо может быть записано на любом языке, это полно по Тьюрингу; различие между языками - то, сколько обручей, до которых необходимо перейти, получает эквивалентный результат.

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

62
задан CharlesB 25 February 2013 в 15:27
поделиться

1 ответ

Я нашел это решение полезным. Работы хорошо, если Вы используете функцию для хранения всего кода сценария. Код будет обработан как одна строка кода. Не имеет значения, если вся строка выполнялась для счетчика покрытия (хотя это не то, что Вы на самом деле на самом деле ожидали бы 100%-м покрытием), прием также принят pylint.;-)

if __name__ == '__main__': \
    main()
-1
ответ дан 24 November 2019 в 16:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: