Python 中通過函式定義所建立的使用者自定義函式物件均具有一些特殊屬性,需要注意的是這裡介紹的是自定義函式(function
型別)的特殊屬性,而非方法(method
型別)的特殊屬性,函式和方法的特熟屬性以及預設的返回值可能不盡相同。
對於大多數特殊屬性,可以通過下面這個例子示範一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Test(): def func(self, v = 'dog'): '''這裡演示一個閉包函式''' name = 'dobi' def inn_func(age = 1): print(name, v, age) return inn_func test = Test() clsfunc = test.func() |
首先看一下方法與函式的區別:例項的函式為bound method
,而類的函式以及閉包均為function
,需要強調的是 Python 2.x 中類的函式為unbound method
,這點與Python 3.x 有所不同,本文則基於 Python 3.51 整理。
1 2 3 4 5 6 |
print(Test.func) # <function Test.func at 0x0000020F0766E268> print(test.func) # <bound method Test.func of <__main__.Test object at 0x0000020F077E5DA0>> print(clsfunc) # <function Test.func.<locals>.inn_func at 0x0000020F071D7F28> |
__doc__
可寫;用於獲取函式的文件說明,如果沒有,則返回 None
。
1 2 3 4 5 |
print('Test.func.__doc__:', Test.func.__doc__) # Test.func.__doc__: 這裡演示一個閉包函式 Test.func.__doc__ = 'ddd' #注意,這裡是 Test,不能是 test print('Test.func.__doc__:', Test.func.__doc__) # Test.func.__doc__: ddd |
__name__
可寫;獲取函式的名稱。
1 2 3 4 5 |
print('Test.func.__name__:', Test.func.__name__) # Test.func.__name__: func Test.func.__name__ = 'pet' print('Test.func.__name__:', Test.func.__name__) # Test.func.__name__: pet |
__qualname__
可寫;獲取函式的qualname
:點示法顯示函式名稱、所在的類、模組等梯級地址。
1 2 3 4 5 |
print('Test.func.__qualname__:', Test.func.__qualname__) # Test.func.__qualname__: Test.func Test.func.__qualname__ = 'path' print('Test.func.__qualname__:', Test.func.__qualname__) # Test.func.__qualname__: path |
__module__
可寫;返回函式所在的模組,如果無則返回None
。
1 2 3 4 5 |
print('Test.func.__module__:', Test.func.__module__) # Test.func.__module__: __main__ Test.func.__module__ = 'a' print('Test.func.__module__:', Test.func.__module__) # Test.func.__module__: a |
__defaults__
可寫;以元組的形式返回函式的預設引數,如果無預設引數則返回None
。
1 2 3 4 5 6 7 8 9 10 |
print('Test.func.__defaults__:', Test.func.__defaults__) # Test.func.__defaults__: ('dog',) Test.func.__defaults__ = ('cat',) print('Test.func.__defaults__:', Test.func.__defaults__) # Test.func.__defaults__: ('cat',) print('clsfunc.__defaults__:', clsfunc.__defaults__) # clsfunc.__defaults__: (1,) clsfunc.__defaults__ = (2,) print('clsfunc.__defaults__:', clsfunc.__defaults__) # clsfunc.__defaults__: (2,) |
__code__
可寫;返回已編譯的函式物件。
1 2 3 4 5 6 7 8 9 |
print('Test.func.__code__:', Test.func.__code__) # Test.func.__code__: def func2():print('cat') Test.func.__code__ = func2.__code__ Test.func() # cat print('Test.func.__code__:', Test.func.__code__) # Test.func.__code__: |
__globals__
只讀,以字典的形式返回函式所在的全域性名稱空間所定義的全域性變數。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
print('Test.func.__globals__:', Test.func.__globals__) # Test.func.__globals__: { # '__cached__': None, # 'Test': <class '__main__.Test'>, # '__builtins__': <module 'builtins' (built-in)>, # 'func2': <function func2 at 0x0000020F077D3C80>, # '__spec__': None, # '__doc__': None, # '__file__': 'D:\\...\\a.py', # 'test': <__main__.Test object at 0x0000020F077E5DA0>, # 'clsfunc': <function Test.func.<locals>.inn_func at 0x0000020F071D7F28>, # '__package__': None, # '__name__': '__main__', # '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000020F07289828> # } |
__dict__
可寫;以字典的形式返回名稱空間所支援的任意自定義的函式屬性。
1 2 |
print('Test.func.__dict__:', Test.func.__dict__) # Test.func.__dict__: {} |
__closure__
只讀;以包含cell
的元組形式返回閉包所包含的自由變數。
1 2 3 4 5 6 7 8 9 |
print('Test.func.__closure__:', Test.func.__closure__) # None print('clsfunc.__closure__:', clsfunc.__closure__) # clsfunc.__closure__: ( # <cell at 0x0000020F071FE708: str object at 0x0000020F07289998>, # <cell at 0x0000020F072B8C78: str object at 0x0000020F0766C538> # ) print('clsfunc.__closure__[x]:', clsfunc.__closure__[0].cell_contents, clsfunc.__closure__[1].cell_contents) # clsfunc.__closure__[x]: dobi dog |
__annotations__
可寫;具體詳見“Python 的函式註釋”
__kwdefaults__
可寫,具體詳見 “Python 的 Keyword-Only Arguments(強制關鍵字引數)”