2017-02-21 1 views
2

Недавно я отправился на собеседование и сделал небольшой тест на программирование, если бы у них был простой двухклассный скрипт, который бы вычислил площадь, длину стороны и т. Д. посмотрел что-то вроде этого:__doc__ в python и с помощью help() в классе

class Shape(object): 

    def __init__(self, side1, side2, side3, side4): 
     self.side1 = side1 
     ... 

    @abstractmethod 
    def calc_area(self): 
     pass 

class Triangle(Shape): 

    def calc_area(self): 
     ... etc.. 

один из вопросов, которые они задавали мне было, если мы побежали help(Shape(3, 5, 5, 6)), что произойдет при условии, все объекты были инициализированы? мой ответ был, ничего, потому что нет docstring или __doc__. Похоже, что я был отмечен этим ответом, и я не могу понять, почему? Был ли я неверным, думая, что ничего не произойдет при запуске help()?

+0

Почему бы вам не попробовать запустить его самостоятельно и не увидеть? – jwodder

+1

@jwodder Поскольку у меня нет полного исходного кода, это то, что у меня есть в памяти. Я думаю, я мог бы сделать базовый класс и попробовать его, но – user7351912

ответ

0

Если посмотреть на источник pydoc.Helper класса (особенно его метод help()), который, по сути, то, что вы получаете, когда вы звоните help(), вы увидите, что он все равно будет получить базовую структуру вашего объекта с помощью модуля inspect и еще несколько трюков.

Целью является, конечно, предоставление, по меньшей мере, объектной/функциональной подписи другим разработчикам, если авторы исходного кода не беспокоились о написании документов. Лично я все равно не вижу причины help(), существующей в глобальном пространстве имен, но я понимаю, почему они поместили ее как с исторической, так и с философской точки зрения.

Как бы то ни было, кто-то, кто вас проинтервьюировал, был ИМО, придурок - на самом деле это не имеет особого отношения к программированию, но с nitpicking, что я могу сказать, совершенно не-Pythonic. То есть, предполагая, что они не пытались получить вас в дескрипторе @abstractmethod, конечно, что может быть правильным вопросом.

+0

Да, это была опечатка, я ее исправил. Я собираюсь перечитать эту часть документов. По-видимому, я идиот. – user7351912

+1

@ user7351912 - Ты не идиот, идиот - это тот, кто занимается вопросами, подобными этим на собеседовании, вместо того, чтобы пытаться измерить, кто лучше всего разбирается в концепциях программирования, эти вопросы просто показывают, кто имеет больше энциклопедических знаний о чем-то совершенно бессвязном. Если бы я чему-то научился в свое время «с другой стороны забора», никогда не спрашивал таких глупых вопросов, кого я соберу интервью. – zwer

+0

Спасибо, что заставляет меня чувствовать себя немного лучше на самом деле. Очень ценится – user7351912

0

Я был неправильно в не думая, что ничего, что произойдет при выполнении help()

Да, вы просто неправильно здесь. Встроенная функция help должна вызывать pydoc.
Было бы показать что-то подобное, как на выходе:

import pydoc 
pydoc.help(Shape(3, 5, 5, 6)) 

Даже если вы не имеете строку документации определена, она будет генерировать некоторый документ о методах и дескрипторов, которые определены для данного объекта.

+0

Почему 'pydoc.help()', а не просто 'help()'? – mkrieger1

+1

Я показываю, откуда идет дисплей, потому что он не волшебным образом появляется. 'help' - простая оболочка вокруг' pydoc.help' с более полезной версией, которая настраивается 'site.py'. Фактическое имя 'help' является всего лишь экземпляром вызываемого класса. – wim

2

В вашем описании кода есть несколько вещей, которые могли бы быть тем, что они ожидали от вас. Это не совсем очевидно для меня, какой из них является ошибкой памяти коды, и который является реальной проблемой, но они оба вещи, чтобы думать:

  1. Shape класса вы показываете имеет @abstractmethod в этом. Если у него был правильно определенный метакласс (что-то получилось от abc.ABCMeta), вы не смогли бы создать из него какие-либо экземпляры. Только конкретные подклассы, которые переопределяют каждый из абстрактных методов, могут быть созданы. Таким образом, они могут ожидать вас сказать «вы не можете назвать help() на Shape(...), потому что последний вызывает TypeError.

  2. Вызов help на примере даст вам описание каждого из методов класса, даже если это Безразлично Если у вас есть docstring, он будет отображаться первым, но документация для методов (и дескрипторов и т. д.) всегда будет следовать.

+0

Я не помню, чтобы видел какой-нибудь 'abc.ABCMeta', я думаю, что я был совсем не прав. Идк почему, но почему-то я думал, что 'help()' будет работать вроде как 'doctest' и работать только в случае присутствия' __doc__' или 'docstring'. – user7351912

Смежные вопросы