Python 自定義函數的特殊屬性(收藏專用)

Python 中經過函數定義所建立的用戶自定義函數對象均具備一些特殊屬性,須要注意的是這裏介紹的是自定義函數(function類型)的特殊屬性,而非方法(method 類型)的特殊屬性,函數和方法的特熟屬性以及默認的返回值可能不盡相同。segmentfault

對於大多數特殊屬性,能夠經過下面這個例子示範一下:閉包

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 整理。函數

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__

可寫;用於獲取函數的文檔說明,若是沒有,則返回 Noneui

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__

可寫;獲取函數的名稱。code

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:點示法顯示函數名稱、所在的類、模塊等梯級地址。對象

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文檔

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__

可寫;以元組的形式返回函數的默認參數,若是無默認參數則返回Noneget

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__

可寫;返回已編譯的函數對象。io

print('Test.func.__code__:', Test.func.__code__)
# Test.func.__code__: <code object func at 0x0000020F072C2F60, file "D:\...\a.py", line 4>

def func2():print('cat')
Test.func.__code__ = func2.__code__
Test.func()
# cat
print('Test.func.__code__:', Test.func.__code__)
# Test.func.__code__: <code object func2 at 0x0000020F072C5780, file "D:\...\a.py", line 38>

__globals__

只讀,以字典的形式返回函數所在的全局命名空間所定義的全局變量。編譯

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__

可寫;以字典的形式返回命名空間所支持的任意自定義的函數屬性。

print('Test.func.__dict__:', Test.func.__dict__)
# Test.func.__dict__: {}

__closure__

只讀;以包含cell的元組形式返回閉包所包含的自由變量。

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(強制關鍵字參數)

相關文章
相關標籤/搜索