鍍金池/ 教程/ Python/ 自省
標準庫 (4)
如何成為 Python 高手
標準庫 (6)
標準庫 (3)
類(2)
Pandas 使用 (2)
xml
用 tornado 做網(wǎng)站 (5)
文件(1)
練習
列表(3)
從小工到專家
除法
錯誤和異常 (2)
函數(shù)(1)
用 tornado 做網(wǎng)站 (7)
為做網(wǎng)站而準備
函數(shù)練習
標準庫 (8)
Pandas 使用 (1)
回顧 list 和 str
字典(1)
用 tornado 做網(wǎng)站 (3)
字符串(1)
函數(shù)(2)
寫一個簡單的程序
將數(shù)據(jù)存入文件
語句(5)
SQLite 數(shù)據(jù)庫
集成開發(fā)環(huán)境(IDE)
集合(1)
類(1)
用 tornado 做網(wǎng)站 (6)
用 tornado 做網(wǎng)站 (2)
自省
語句(4)
錯誤和異常 (1)
用 tornado 做網(wǎng)站 (4)
集合(2)
列表(1)
標準庫 (1)
生成器
mysql 數(shù)據(jù)庫 (1)
第三方庫
實戰(zhàn)
運算符
類(3)
字典(2)
語句(1)
數(shù)和四則運算
語句(2)
文件(2)
MySQL 數(shù)據(jù)庫 (2)
電子表格
迭代器
mongodb 數(shù)據(jù)庫 (1)
特殊方法 (2)
特殊方法 (1)
字符編碼
編寫模塊
用 tornado 做網(wǎng)站 (1)
標準庫 (5)
函數(shù)(4)
類(5)
字符串(2)
關(guān)于 Python 的故事
函數(shù)(3)
字符串(4)
處理股票數(shù)據(jù)
常用數(shù)學函數(shù)和運算優(yōu)先級
字符串(3)
為計算做準備
多態(tài)和封裝
類(4)
迭代
語句(3)
錯誤和異常 (3)
分析 Hello
Python 安裝
標準庫 (2)
列表(2)
元組

自省

特別說明,這一講的內(nèi)容不是我寫的,是我從《Python自省指南》抄錄過來的,當然,為了適合本教程,我在某些地方做了修改或者重寫。

什么是自???

在日常生活中,自?。╥ntrospection)是一種自我檢查行為。自省是指對某人自身思想、情緒、動機和行為的檢查。偉大的哲學家蘇格拉底將生命中的大部分時間用于自我檢查,并鼓勵他的雅典朋友們也這樣做。他甚至對自己作出了這樣的要求:“未經(jīng)自省的生命不值得存在?!睙o獨有偶,在中國《論語》中,也有這樣的名言:“吾日三省吾身”。顯然,自省對個人成長多么重要呀。

在計算機編程中,自省是指這種能力:檢查某些事物以確定它是什么、它知道什么以及它能做什么。自省向程序員提供了極大的靈活性和控制力。一旦您使用了支持自省的編程語言,就會產(chǎn)生類似這樣的感覺:“未經(jīng)檢查的對象不值得實例化。”

整個 Python 語言對自省提供了深入而廣泛的支持。實際上,很難想象假如 Python 語言沒有其自省特性是什么樣子。

學完這節(jié),你就能夠輕松洞察到 Python 對象的“靈魂”。

在深入研究更高級的技術(shù)之前,我們盡可能用最普通的方式來研究 Python 自省。有些讀者甚至可能會爭論說:我們開始時所討論的特性不應稱之為“自省”。我們必須承認,它們是否屬于自省的范疇還有待討論。但從本節(jié)的意圖出發(fā),我們所關(guān)心的只是找出有趣問題的答案。

現(xiàn)在讓我們以交互方式使用 Python 來開始研究。這是前面已經(jīng)在使用的一種方式。

聯(lián)機幫助

在交互模式下,用 help 向 Python 請求幫助。

>>> help()

Welcome to Python 2.7!  This is the online help utility.

If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/2.7/tutorial/.

Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules.  To quit this help utility and
return to the interpreter, just type "quit".

To get a list of available modules, keywords, or topics, type "modules",
"keywords", or "topics".  Each module also comes with a one-line summary
of what it does; to list the modules whose summaries contain a given word
such as "spam", type "modules spam".

help> 

這時候就進入了聯(lián)機幫助狀態(tài),根據(jù)提示輸入 keywords

help> keywords

Here is a list of the Python keywords.  Enter any keyword to get more help.

and                 elif                if                  print
as                  else                import              raise
assert              except              in                  return
break               exec                is                  try
class               finally             lambda              while
continue            for                 not                 with
def                 from                or                  yield
del                 global              pass                

現(xiàn)在顯示出了 Python 關(guān)鍵詞的列表。依照說明亦步亦趨,輸入每個關(guān)鍵詞,就能看到那個關(guān)鍵詞的相關(guān)文檔。這里就不展示輸入的結(jié)果了。讀者可以自行嘗試。要記住,如果從文檔說明界面返回到幫助界面,需要按 q 鍵。

這樣,我們能夠得到聯(lián)機幫助。從聯(lián)機幫助狀態(tài)退回到 Python 的交互模式,使用 quit 命令。

help> quit

You are now leaving help and returning to the Python interpreter.
If you want to ask for help on a particular object directly from the
interpreter, you can type "help(object)".  Executing "help('string')"
has the same effect as typing a particular string at the help> prompt.
>>> 

聯(lián)機幫助實用程序會顯示關(guān)于各種主題或特定對象的信息。

幫助實用程序很有用,并確實利用了 Python 的自省能力。但僅僅使用幫助不會揭示幫助是如何獲得其信息的。而且,因為我們的目的是揭示 Python 自省的所有秘密,所以我們必須迅速地跳出對幫助實用程序的討論。

在結(jié)束關(guān)于幫助的討論之前,讓我們用它來獲得一個可用模塊的列表。

模塊只是包含 Python 代碼的文本文件,其名稱后綴是 .py ,關(guān)于模塊,本教程會在后面有專門的講解。如果在 Python 提示符下輸入 help('modules') ,或在 help 提示符下輸入 modules,則會看到一長列可用模塊,類似于下面所示的部分列表。自己嘗試它以觀察您的系統(tǒng)中有哪些可用模塊,并了解為什么會認為 Python 是“自帶電池”的(自帶電池,這是一個比喻,就是說 Python 在被安裝時,就帶了很多模塊,這些模塊是你以后開發(fā)中會用到的,比喻成電池,好比開發(fā)的助力工具),或者說是 Python 一被安裝,就已經(jīng)包含有的模塊,不用我們費力再安裝了。

>>> help("modules")

Please wait a moment while I gather a list of all available modules...
ANSI                _threading_local    gnomekeyring        repr
BaseHTTPServer      _warnings           gobject             requests
MySQLdb             chardet             lsb_release         sre_parse
......(此處省略一些)
PyQt4               codeop              markupbase          stringprep
Queue               collections         marshal             strop
ScrolledText        colorama            math                struct
......(省略其它的模塊)
Enter any module name to get more help.  Or, type "modules spam" to search
for modules whose descriptions contain the word "spam".

因為太多,無法全部顯示。你可以子線觀察一下,是不是有我們前面已經(jīng)用過的那個 mathrandom 模塊呢?

如果是在 Python 交互模式 >>> 下,比如要得到有關(guān) math 模塊的更多幫助,可以輸入 >>> help("math"),如果是在幫助模式 help> 下,直接輸入 >math 就能得到關(guān)于 math 模塊的詳細信息。簡直太貼心了。

dir()

盡管查找和導入模塊相對容易,但要記住每個模塊包含什么卻不是這么簡單。你或許并不希望總是必須查看源代碼來找出答案。幸運的是,Python 提供了一種方法,可以使用內(nèi)置的 dir() 函數(shù)來檢查模塊(以及其它對象)的內(nèi)容。

其實,這個東西我們已經(jīng)一直在使用。

dir() 函數(shù)可能是 Python 自省機制中最著名的部分了。它返回傳遞給它的任何對象的屬性名稱經(jīng)過排序的列表。如果不指定對象,則 dir() 返回當前作用域中(這里冒出來一個新名詞:“作用域”,暫且不用管它,后面會詳解,你就姑且理解為某個范圍吧)的名稱。讓我們將 dir() 函數(shù)應用于 keyword 模塊,并觀察它揭示了什么:

>>> import keyword
>>> dir(keyword)
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'iskeyword', 'kwlist', 'main']

如果不帶任何參數(shù),則 dir() 返回當前作用域中的名稱。請注意,因為我們先前導入了 keyword ,所以它們出現(xiàn)在列表中。導入模塊將把該模塊的名稱添加到當前作用域:

>>> dir()
['GFileDescriptorBased', 'GInitiallyUnowned', 'GPollableInputStream', 'GPollableOutputStream', '__builtins__', '__doc__', '__name__', '__package__', 'keyword']
>>> import math
>>> dir()
['GFileDescriptorBased', 'GInitiallyUnowned', 'GPollableInputStream', 'GPollableOutputStream', '__builtins__', '__doc__', '__name__', '__package__', 'keyword', 'math']

dir() 函數(shù)是內(nèi)置函數(shù),這意味著我們不必為了使用該函數(shù)而導入模塊。不必做任何操作,Python 就可識別內(nèi)置函數(shù)。

再觀察,看到調(diào)用 dir() 后返回了這個名稱 __builtins__ 。也許此處有連接。讓我們在 Python 提示符下輸入名稱 __builtins__ ,并觀察 Python 是否會告訴我們關(guān)于它的任何有趣的事情:

>>> __builtins__
<module '__builtin__' (built-in)>

因此 __builtins__ 看起來象是當前作用域中綁定到名為 __builtin__ 的模塊對象的名稱。(因為模塊不是只有多個單一值的簡單對象,所以 Python 改在尖括號中顯示關(guān)于模塊的信息。)

注:如果您在磁盤上尋找 __builtin__.py 文件,將空手而歸。這個特殊的模塊對象是 Python 解釋器憑空創(chuàng)建的,因為它包含著解釋器始終可用的項。盡管看不到物理文件,但我們?nèi)钥梢詫?dir() 函數(shù)應用于這個對象,以觀察所有內(nèi)置函數(shù)、錯誤對象以及它所包含的幾個雜項屬性。

>>> dir(__builtins__)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'ascii', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'ngettext', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']

dir() 函數(shù)適用于所有對象類型,包括字符串、整數(shù)、列表、元組、字典、函數(shù)、定制類、類實例和類方法(不理解的對象類型,會在隨后的教程中講解)。例如將 dir() 應用于字符串對象,如您所見,即使簡單的 Python 字符串也有許多屬性(這是前面已經(jīng)知道的了,權(quán)當復習)

>>> dir("You raise me up")
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

讀者可以嘗試一下其它的對象類型,觀察返回結(jié)果,如:dir(42),dir([]),dir(()),dir({}),dir(dir)`。

文檔字符串

在許多 dir() 示例中,您可能會注意到的一個屬性是 __doc__ 屬性。這個屬性是一個字符串,它包含了描述對象的注釋。Python 稱之為文檔字符串或 docstring(這個內(nèi)容,會在下一部分中講解如何自定義設(shè)置)。

如果模塊、類、方法或函數(shù)定義的第一條語句是字符串,那么該字符串會作為對象的 __doc__ 屬性與該對象關(guān)聯(lián)起來。例如,看一下 str 類型對象的文檔字符串。因為文檔字符串通常包含嵌入的換行 \n ,我們將使用 Python 的 print 語句,以便輸出更易于閱讀:

>>> print str.__doc__
str(object='') -> string

Return a nice string representation of the object.
If the argument is a string, the return value is the same object.

檢查 Python 對象

前面已經(jīng)好幾次提到了“對象(object)”這個詞,但一直沒有真正定義它。編程環(huán)境中的對象很象現(xiàn)實世界中的對象。實際的對象有一定的形狀、大小、重量和其它特征。實際的對象還能夠?qū)ζ洵h(huán)境進行響應、與其它對象交互或執(zhí)行任務。計算機中的對象試圖模擬我們身邊現(xiàn)實世界中的對象,包括象文檔、日程表和業(yè)務過程這樣的抽象對象。

其實,我總覺得把 object 翻譯成對象,讓人感覺很沒有具象的感覺,因為在漢語里面,對象是一個很籠統(tǒng)的詞匯。另外一種翻譯,流行于臺灣,把它稱為“物件”,倒是挺不錯的理解。當然,名詞就不糾纏了,關(guān)鍵是理解內(nèi)涵。關(guān)于面向?qū)ο缶幊?,可以閱讀維基百科的介紹——面向?qū)ο蟪绦蛟O(shè)計——先了解大概。

類似于實際的對象,幾個計算機對象可能共享共同的特征,同時保持它們自己相對較小的變異特征。想一想您在書店中看到的書籍。書籍的每個物理副本都可能有污跡、幾張破損的書頁或唯一的標識號。盡管每本書都是唯一的對象,但都擁有相同標題的每本書都只是原始模板的實例,并保留了原始模板的大多數(shù)特征。

對于面向?qū)ο蟮念惡皖悓嵗彩侨绱?。例如,可以看到每個 Python 符串都被賦予了一些屬性, dir() 函數(shù)揭示了這些屬性。

于是在計算機術(shù)語中,對象是擁有標識和值的事物,屬于特定類型、具有特定特征和以特定方式執(zhí)行操作。并且,對象從一個或多個父類繼承了它們的許多屬性。除了關(guān)鍵字和特殊符號(象運算符,如 + 、 - 、 * 、 ** 、 / 、 % 、 < 、 > 等)外,Python 中的所有東西都是對象。Python 具有一組豐富的對象類型:字符串、整數(shù)、浮點、列表、元組、字典、函數(shù)、類、類實例、模塊、文件等。

當您有一個任意的對象(也許是一個作為參數(shù)傳遞給函數(shù)的對象)時,可能希望知道一些關(guān)于該對象的情況。如希望 Python 告訴我們:

  • 對象的名稱是什么?
  • 這是哪種類型的對象?
  • 對象知道些什么?
  • 對象能做些什么?
  • 對象的父對象是誰?

名稱

并非所有對象都有名稱,但那些有名稱的對象都將名稱存儲在其 __name__ 屬性中。注:名稱是從對象而不是引用該對象的變量中派生的。

>>> dir()    #dir() 函數(shù)
['GFileDescriptorBased', 'GInitiallyUnowned', 'GPollableInputStream', 'GPollableOutputStream', '__builtins__', '__doc__', '__name__', '__package__', 'keyword', 'math']
>>> directory = dir    #新變量
>>> directory()        #跟 dir() 一樣的結(jié)果
['GFileDescriptorBased', 'GInitiallyUnowned', 'GPollableInputStream', 'GPollableOutputStream', '__builtins__', '__doc__', '__name__', '__package__', 'directory', 'keyword', 'math']
>>> dir.__name__       #dir() 的名字
'dir'
>>> directory.__name__
'dir'

>>> __name__          #這是不一樣的   
'__main__'

模塊擁有名稱,Python 解釋器本身被認為是頂級模塊或主模塊。當以交互的方式運行 Python 時,局部 __name__ 變量被賦予值 '__main__' 。同樣地,當從命令行執(zhí)行 Python 模塊,而不是將其導入另一個模塊時,其 __name__ 屬性被賦予值 '__main__' ,而不是該模塊的實際名稱。這樣,模塊可以查看其自身的 __name__ 值來自行確定它們自己正被如何使用,是作為另一個程序的支持,還是作為從命令行執(zhí)行的主應用程序。因此,下面這條慣用的語句在 Python 模塊中是很常見的:

if __name__ == '__main__':
    # Do something appropriate here, like calling a
    # main() function defined elsewhere in this module.
    main()
else:
    # Do nothing. This module has been imported by another
    # module that wants to make use of the functions,
    # classes and other useful bits it has defined.

類型

type() 函數(shù)有助于我們確定對象是字符串還是整數(shù),或是其它類型的對象。它通過返回類型對象來做到這一點,可以將這個類型對象與 types 模塊中定義的類型相比較:

>>> import types
>>> print types.__doc__
Define names for all type symbols known in the standard interpreter.

Types that are part of optional modules (e.g. array) are not listed.

>>> dir(types)
['BooleanType', 'BufferType', 'BuiltinFunctionType', 'BuiltinMethodType', 'ClassType', 'CodeType', 'ComplexType', 'DictProxyType', 'DictType', 'DictionaryType', 'EllipsisType', 'FileType', 'FloatType', 'FrameType', 'FunctionType', 'GeneratorType', 'GetSetDescriptorType', 'InstanceType', 'IntType', 'LambdaType', 'ListType', 'LongType', 'MemberDescriptorType', 'MethodType', 'ModuleType', 'NoneType', 'NotImplementedType', 'ObjectType', 'SliceType', 'StringType', 'StringTypes', 'TracebackType', 'TupleType', 'TypeType', 'UnboundMethodType', 'UnicodeType', 'XRangeType', '__builtins__', '__doc__', '__file__', '__name__', '__package__']
>>> p = "I love Python"
>>> type(p)
<type 'str'>
>>> if type(p) is types.StringType:
...     print "p is a string"
... 
p is a string
>>> type(42)
<type 'int'>
>>> type([])
<type 'list'>
>>> type({})
<type 'dict'>
>>> type(dir)
<type 'builtin_function_or_method'>

標識

先前說過,每個對象都有標識、類型和值。值得注意的是,可能有多個變量引用同一對象,同樣地,變量可以引用看起來相似(有相同的類型和值),但擁有截然不同標識的多個對象。當更改對象時(如將某一項添加到列表),這種關(guān)于對象標識的概念尤其重要,如在下面的示例中, blist 和 clist 變量引用同一個列表對象。正如您在示例中所見, id() 函數(shù)給任何給定對象返回唯一的標識符。其實,這個東東我們也在前面已經(jīng)使用過了。在這里再次提出,能夠讓你理解上有提升吧。

>>> print id.__doc__
id(object) -> integer

Return the identity of an object.  This is guaranteed to be unique among
simultaneously existing objects.  (Hint: it's the object's memory address.)
>>> alist = [1,2,3]
>>> blist = [1,2,3]
>>> clist = blist
>>> id(alist)
2979691052L
>>> id(blist)
2993911916L
>>> id(clist)
2993911916L
>>> alist is blist
False
>>> blist is clist
True
>>> clist.append(4)
>>> clist
[1, 2, 3, 4]
>>> blist
[1, 2, 3, 4]
>>> alist
[1, 2, 3]

如果對上面的操作還有疑惑,可以回到前面復習有關(guān)深拷貝和淺拷貝的知識。

屬性

對象擁有屬性,并且 dir() 函數(shù)會返回這些屬性的列表。但是,有時我們只想測試一個或多個屬性是否存在。如果對象具有我們正在考慮的屬性,那么通常希望只檢索該屬性。這個任務可以由 hasattr() 和 getattr() 函數(shù)來完成.

>>> print hasattr.__doc__
hasattr(object, name) -> bool

Return whether the object has an attribute with the given name.
(This is done by calling getattr(object, name) and catching exceptions.)

>>> print getattr.__doc__
getattr(object, name[, default]) -> value

Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
When a default argument is given, it is returned when the attribute doesn't
exist; without it, an exception is raised in that case.
>>> 
>>> hasattr(id, '__doc__')
True

>>> print getattr(id, '__doc__')
id(object) -> integer

Return the identity of an object.  This is guaranteed to be unique among
simultaneously existing objects.  (Hint: it's the object's memory address.)

可調(diào)用

可以調(diào)用表示潛在行為(函數(shù)和方法)的對象。可以用 callable() 函數(shù)測試對象的可調(diào)用性:

>>> print callable.__doc__
callable(object) -> bool

Return whether the object is callable (i.e., some kind of function).
Note that classes are callable, as are instances with a __call__() method.
>>> callable("a string")
False
>>> callable(dir)
True

實例

這個名詞還很陌生,沒關(guān)系,先看看,混個臉熟,以后會經(jīng)常用到。

在 type() 函數(shù)提供對象的類型時,還可以使用 isinstance() 函數(shù)測試對象,以確定它是否是某個特定類型或定制類的實例:

>>> print isinstance.__doc__
isinstance(object, class-or-type-or-tuple) -> bool

Return whether an object is an instance of a class or of a subclass thereof.
With a type as second argument, return whether that is the object's type.
The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for
isinstance(x, A) or isinstance(x, B) or ... (etc.).
>>> isinstance(42, str)
False
>>> isinstance("python", str)
True

子類

關(guān)于類的問題,有一個“繼承”概念,有繼承就有父子問題,這是在現(xiàn)實生活中很正常的,在編程語言中也是如此。雖然這是后面要說的,但是,為了本講內(nèi)容的完整,也姑且把這個內(nèi)容放在這里。讀者可以不看,留著以后看也行。我更建議還是閱讀一下,有個印象。

在類這一級別,可以根據(jù)一個類來定義另一個類,同樣地,這個新類會按照層次化的方式繼承屬性。Python 甚至支持多重繼承,多重繼承意味著可以用多個父類來定義一個類,這個新類繼承了多個父類。 issubclass() 函數(shù)使我們可以查看一個類是不是繼承了另一個類:

>>> print issubclass.__doc__
issubclass(C, B) -> Boolean
Return whether class C is a subclass (i.e., a derived class) of class B.
>>> class SuperHero(Person):   # SuperHero inherits from Person...
...     def intro(self):       # but with a new SuperHero intro
...         """Return an introduction."""
...         return "Hello, I'm SuperHero %s and I'm %s." % (self.name, self.age)
...
>>> issubclass(SuperHero, Person)
1
>>> issubclass(Person, SuperHero)
0

Python 文檔

文檔,這個詞語在經(jīng)常在程序員的嘴里冒出來,有時候他們還經(jīng)常以文檔有沒有或者全不全為標準來衡量一個軟件項目是否高大上。那么,軟件中的文檔是什么呢?有什么要求呢?Python 文檔又是什么呢?文檔有什么用呢?

文檔很重要。獨孤九劍的劍訣、易筋經(jīng)的心法、寫著辟邪劍譜的袈裟,這些都是文檔。連那些大牛人都要這些文檔,更何況我們呢?所以,文檔是很重要的。

文檔,說白了就是用 word(這個最多了)等(注意這里的等,把不常用的工具都等掉了,包括我編輯文本時用的 vim 工具)文本編寫工具寫成的包含文本內(nèi)容但不限于文字的文件。有點啰嗦,啰嗦的目的是為了嚴謹,呵呵。最好還是來一個更讓人信服的定義,當然是來自維基百科。

軟件文檔或者源代碼文檔是指與軟件系統(tǒng)及其軟件工程過程有關(guān)聯(lián)的文本實體。文檔的類型包括軟件需求文檔,設(shè)計文檔,測試文檔,用戶手冊等。其中的需求文檔,設(shè)計文檔和測試文檔一般是在軟件開發(fā)過程中由開發(fā)者寫就的,而用戶手冊等非過程類文檔是由專門的非技術(shù)類寫作人員寫就的。

早期的軟件文檔主要指的是用戶手冊,根據(jù) Barker 的定義,文檔是用來對軟件系統(tǒng)界面元素的設(shè)計、規(guī)劃和實現(xiàn)過程的記錄,以此來增強系統(tǒng)的可用性。而 Forward 則認為軟件文檔是被軟件工程師之間用作溝通交流的一種方式,溝通的信息主要是有關(guān)所開發(fā)的軟件系統(tǒng)。Parnas 則強調(diào)文檔的權(quán)威性,他認為文檔應該提供對軟件系統(tǒng)的精確描述。

綜上,我們可以將軟件文檔定義為:

1.文檔是一種對軟件系統(tǒng)的書面描述; 2.文檔應當精確地描述軟件系統(tǒng); 3.軟件文檔是軟件工程師之間用作溝通交流的一種方式; 4.文檔的類型有很多種,包括軟件需求文檔,設(shè)計文檔,測試文檔,用戶手冊等; 5.文檔的呈現(xiàn)方式有很多種,可以是傳統(tǒng)的書面文字形式或圖表形式,也可是動態(tài)的網(wǎng)頁形式

那么這里說的 Python 文檔指的是什么呢?一個方面就是每個學習者要學習 Python,Python 的開發(fā)者們(他們都是大牛)給我們這些小白提供了什么東西沒有?能夠讓我們給他們這些大牛溝通,理解 Python 中每個函數(shù)、指令等的含義和用法呢?

有。大牛就是大牛,他們準備了,而且還不止一個。

真誠的敬告所有看本教程的諸位,要想獲得編程上的升華,看文檔是必須的。文檔勝過了所有的教程和所有的老師以及所有的大牛。為什么呢?其中原因,都要等待看官看懂了之后,有了體會感悟之后才能明白。

Python 文檔的網(wǎng)址:https://docs.python.org/2/,這是 Python2.x,從這里也可以找到 Python3.x 的文檔。

當然,除了看官方文檔之外,自己寫的東西也可以寫上文檔。這個先不要著急,我們會在后續(xù)的學習中看到。


總目錄   |   上節(jié):練習   |   下節(jié):函數(shù)(1)

如果你認為有必要打賞我,請通過支付寶:qiwsir@126.com,不勝感激。