2017-02-21 23 views
2

我最近去了一次採訪,做了一些小編程測試,他們有一個簡單的兩個類的腳本,可以計算面積,邊長等。看起來是這樣的:__doc__在Python中使用幫助()在一個類

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()在全球命名空間中存在的原因,但我理解他們爲什麼將它放在歷史和哲學的角度。這就是說,接受採訪的人是IMO,一個混蛋 - 這不需要太多的編程工作,而是用挑剔的東西,但我可以說,這可能是非常不合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'的簡單包裝,帶有一個更有用的repr,它由'site.py'設置。實際的名稱'help'只是一個可調用類的實例。 – wim

2

在您對代碼的描述中有幾件事可能是他們期待您提及的。這不是完全明顯,我這的這些是你的代碼的內存錯誤,而這是真正的問題,但他們都是一些事情要考慮:

  1. Shape類告訴你有一個@abstractmethod在裏面。如果它有一個正確定義的元類(從abc.ABCMeta派生的東西),您將無法從中創建任何實例。只有重寫每個抽象方法的具體子類才能被實例化。因此,他們可能會以爲你會說:「你不能在Shape(...)調用help()因爲後者會導致TypeError

  2. 上的一個實例調用help會給你的每一個類的方法的描述,即使它不沒有文檔字符串,如果文檔字符串存在,它將首先顯示,但方法(和描述符等)的文檔將始終顯示。

+0

我不記得看到任何'abc.ABCMeta',我想我只是在錯誤。 Idk爲什麼但因爲某種原因,我認爲'help()'會像'doctest'那樣運行,並且只有在存在'__doc__'或'docstring'時纔會工作。 – user7351912