国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

zhou_you / 2936人閱讀

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)
# 
print(test.func)
# >
print(clsfunc)
# .inn_func at 0x0000020F071D7F28>
__doc__

可寫;用于獲取函數的文檔說明,如果沒有,則返回 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": , 
# "__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>
# }
__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__: (
# , 
# 
# )
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(強制關鍵字參數)”

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/45475.html

相關文章

  • ??爆肝十二萬字《python從零到精通教程》,從零教你變大佬??(建議收藏

    文章目錄 強烈推薦系列教程,建議學起來!! 一.pycharm下載安裝二.python下載安裝三.pycharm上配置python四.配置鏡像源讓你下載嗖嗖的快4.1pycharm內部配置 4.2手動添加鏡像源4.3永久配置鏡像源 五.插件安裝(比如漢化?)5.1自動補碼神器第一款5.2漢化pycharm5.3其它插件 六.美女背景七.自定義腳本開頭八、這個前言一定要看九、pyt...

    booster 評論0 收藏0
  • Python進階:迭代器與迭代器切片

    摘要:本文是切片系列的第三篇,主要內容是迭代器切片。實際上,迭代器必然是可迭代對象,但可迭代對象不一定是迭代器。這是迭代器切片最具想象力的用途場景。考慮到文件對象天然就是迭代器,我們可以使用迭代器切片先行截取,然后再處理,如此效率將大大地提升。 2018-12-31 更新聲明:切片系列文章本是分三篇寫成,現已合并成一篇。合并后,修正了一些嚴重的錯誤(如自定義序列切片的部分),還對行文結構與章...

    hedge_hog 評論0 收藏0
  • Python進階:迭代器與迭代器切片

    摘要:本文是切片系列的第三篇,主要內容是迭代器切片。實際上,迭代器必然是可迭代對象,但可迭代對象不一定是迭代器。這是迭代器切片最具想象力的用途場景。考慮到文件對象天然就是迭代器,我們可以使用迭代器切片先行截取,然后再處理,如此效率將大大地提升。 2018-12-31 更新聲明:切片系列文章本是分三篇寫成,現已合并成一篇。合并后,修正了一些嚴重的錯誤(如自定義序列切片的部分),還對行文結構與章...

    omgdog 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<