Python 中通過函數定義所創建的用戶自定義函數對象均具有一些特殊屬性,需要注意的是這里介紹的是自定義函數(function類型)的特殊屬性,而非方法(method 類型)的特殊屬性,函數和方法的特熟屬性以及默認的返回值可能不盡相同。
對于大多數特殊屬性,可以通過下面這個例子示范一下:
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) #__doc__print(test.func) # > print(clsfunc) # .inn_func at 0x0000020F071D7F28>
可寫;用于獲取函數的文檔說明,如果沒有,則返回 None。
print("Test.func.__doc__:", Test.func.__doc__) # Test.func.__doc__: 這里演示一個閉包函數 Test.func.__doc__ = "ffffd" #注意,這里是 Test,不能是 test print("Test.func.__doc__:", Test.func.__doc__) # Test.func.__doc__: ffffd__name__
可寫;獲取函數的名稱。
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__
可寫;以元組的形式返回函數的默認參數,如果無默認參數則返回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__
可寫;返回已編譯的函數對象。
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__
只讀,以字典的形式返回函數所在的全局命名空間所定義的全局變量。
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> # }
可寫;以字典的形式返回命名空間所支持的任意自定義的函數屬性。
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 |
可寫;具體詳見“Python 的函數注釋”
__kwdefaults__可寫,具體詳見 “Python 的 Keyword-Only Arguments(強制關鍵字參數)”
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/45475.html
文章目錄 強烈推薦系列教程,建議學起來!! 一.pycharm下載安裝二.python下載安裝三.pycharm上配置python四.配置鏡像源讓你下載嗖嗖的快4.1pycharm內部配置 4.2手動添加鏡像源4.3永久配置鏡像源 五.插件安裝(比如漢化?)5.1自動補碼神器第一款5.2漢化pycharm5.3其它插件 六.美女背景七.自定義腳本開頭八、這個前言一定要看九、pyt...
摘要:本文是切片系列的第三篇,主要內容是迭代器切片。實際上,迭代器必然是可迭代對象,但可迭代對象不一定是迭代器。這是迭代器切片最具想象力的用途場景。考慮到文件對象天然就是迭代器,我們可以使用迭代器切片先行截取,然后再處理,如此效率將大大地提升。 2018-12-31 更新聲明:切片系列文章本是分三篇寫成,現已合并成一篇。合并后,修正了一些嚴重的錯誤(如自定義序列切片的部分),還對行文結構與章...
摘要:本文是切片系列的第三篇,主要內容是迭代器切片。實際上,迭代器必然是可迭代對象,但可迭代對象不一定是迭代器。這是迭代器切片最具想象力的用途場景。考慮到文件對象天然就是迭代器,我們可以使用迭代器切片先行截取,然后再處理,如此效率將大大地提升。 2018-12-31 更新聲明:切片系列文章本是分三篇寫成,現已合并成一篇。合并后,修正了一些嚴重的錯誤(如自定義序列切片的部分),還對行文結構與章...
閱讀 3261·2021-11-11 11:00
閱讀 2578·2019-08-29 11:23
閱讀 1459·2019-08-29 10:58
閱讀 2343·2019-08-29 10:58
閱讀 2964·2019-08-23 18:26
閱讀 2521·2019-08-23 18:18
閱讀 2050·2019-08-23 16:53
閱讀 3425·2019-08-23 13:13