Python 中通過(guò)函數(shù)定義所創(chuàng)建的用戶自定義函數(shù)對(duì)象均具有一些特殊屬性,需要注意的是這里介紹的是自定義函數(shù)(function類型)的特殊屬性,而非方法(method 類型)的特殊屬性,函數(shù)和方法的特熟屬性以及默認(rèn)的返回值可能不盡相同。
對(duì)于大多數(shù)特殊屬性,可以通過(guò)下面這個(gè)例子示范一下:
class Test(): def func(self, v = "dog"): """這里演示一個(gè)閉包函數(shù)""" name = "dobi" def inn_func(age = 1): print(name, v, age) return inn_func test = Test() clsfunc = test.func()
首先看一下方法與函數(shù)的區(qū)別:實(shí)例的函數(shù)為bound method,而類的函數(shù)以及閉包均為function,需要強(qiáng)調(diào)的是 Python 2.x 中類的函數(shù)為unbound method,這點(diǎn)與Python 3.x 有所不同,本文則基于 Python 3.51 整理。
print(Test.func) #__doc__print(test.func) # > print(clsfunc) # .inn_func at 0x0000020F071D7F28>
可寫;用于獲取函數(shù)的文檔說(shuō)明,如果沒(méi)有,則返回 None。
print("Test.func.__doc__:", Test.func.__doc__) # Test.func.__doc__: 這里演示一個(gè)閉包函數(shù) Test.func.__doc__ = "ffffd" #注意,這里是 Test,不能是 test print("Test.func.__doc__:", Test.func.__doc__) # Test.func.__doc__: ffffd__name__
可寫;獲取函數(shù)的名稱。
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__
可寫;獲取函數(shù)的qualname:點(diǎn)示法顯示函數(shù)名稱、所在的類、模塊等梯級(jí)地址。
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__
可寫;返回函數(shù)所在的模塊,如果無(wú)則返回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__
可寫;以元組的形式返回函數(shù)的默認(rèn)參數(shù),如果無(wú)默認(rèn)參數(shù)則返回None。
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__
可寫;返回已編譯的函數(shù)對(duì)象。
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__
只讀,以字典的形式返回函數(shù)所在的全局命名空間所定義的全局變量。
print("Test.func.__globals__:", Test.func.__globals__) # Test.func.__globals__: { # "__cached__": None, # "Test":__dict__, # "__builtins__": , # "func2": , # "__spec__": None, # "__doc__": None, # "__file__": "D:...a.py", # "test": <__main__.Test object at 0x0000020F077E5DA0>, # "clsfunc": .inn_func at 0x0000020F071D7F28>, # "__package__": None, # "__name__": "__main__", # "__loader__": <_frozen_importlib_external.SourceFileLoader object at 0x0000020F07289828> # }
可寫;以字典的形式返回命名空間所支持的任意自定義的函數(shù)屬性。
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__: ( #__annotations__, # | # ) print("clsfunc.__closure__[x]:", clsfunc.__closure__[0].cell_contents, clsfunc.__closure__[1].cell_contents) # clsfunc.__closure__[x]: dobi dog |
可寫;具體詳見(jiàn)“Python 的函數(shù)注釋”
__kwdefaults__可寫,具體詳見(jiàn) “Python 的 Keyword-Only Arguments(強(qiáng)制關(guān)鍵字參數(shù))”
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/45475.html
文章目錄 強(qiáng)烈推薦系列教程,建議學(xué)起來(lái)??! 一.pycharm下載安裝二.python下載安裝三.pycharm上配置python四.配置鏡像源讓你下載嗖嗖的快4.1pycharm內(nèi)部配置 4.2手動(dòng)添加鏡像源4.3永久配置鏡像源 五.插件安裝(比如漢化?)5.1自動(dòng)補(bǔ)碼神器第一款5.2漢化pycharm5.3其它插件 六.美女背景七.自定義腳本開(kāi)頭八、這個(gè)前言一定要看九、pyt...
摘要:本文是切片系列的第三篇,主要內(nèi)容是迭代器切片。實(shí)際上,迭代器必然是可迭代對(duì)象,但可迭代對(duì)象不一定是迭代器。這是迭代器切片最具想象力的用途場(chǎng)景??紤]到文件對(duì)象天然就是迭代器,我們可以使用迭代器切片先行截取,然后再處理,如此效率將大大地提升。 2018-12-31 更新聲明:切片系列文章本是分三篇寫成,現(xiàn)已合并成一篇。合并后,修正了一些嚴(yán)重的錯(cuò)誤(如自定義序列切片的部分),還對(duì)行文結(jié)構(gòu)與章...
摘要:本文是切片系列的第三篇,主要內(nèi)容是迭代器切片。實(shí)際上,迭代器必然是可迭代對(duì)象,但可迭代對(duì)象不一定是迭代器。這是迭代器切片最具想象力的用途場(chǎng)景??紤]到文件對(duì)象天然就是迭代器,我們可以使用迭代器切片先行截取,然后再處理,如此效率將大大地提升。 2018-12-31 更新聲明:切片系列文章本是分三篇寫成,現(xiàn)已合并成一篇。合并后,修正了一些嚴(yán)重的錯(cuò)誤(如自定義序列切片的部分),還對(duì)行文結(jié)構(gòu)與章...
閱讀 3310·2021-11-11 11:00
閱讀 2633·2019-08-29 11:23
閱讀 1512·2019-08-29 10:58
閱讀 2406·2019-08-29 10:58
閱讀 3014·2019-08-23 18:26
閱讀 2569·2019-08-23 18:18
閱讀 2089·2019-08-23 16:53
閱讀 3470·2019-08-23 13:13