Python 函式自定義屬性 及 code

2021-10-10 07:02:00 字數 3551 閱讀 3940

python 是物件導向的語言,在 python中一切皆物件。函式自然也不例外。

它有屬於物件的屬性,除此之外,函式還可以自定義屬性。注意,屬性是和物件相關的,和作用域無關

注意:這裡說的是函式(function型別)的特殊屬性,而非方法(method型別)的特殊屬性。

函式自定義屬性的方式很簡單,假設函式名為myfunc

# 設定屬性

myfunc.version =

'v1.0.1'

# 訪問屬性

print(myfunc.version)

這個屬性version可以像全域性變數一樣被訪問,修改。但它並不是全域性變數

# 檢視函式全部屬性

dir(myfunc)

['__annotations__'

,'__call__'

,'__class__'

,'__closure__'

,'__code__'

,'__defaults__'

,'__delattr__'

,'__dict__'

,'__dir__'

,'__doc__'

,'__eq__'

,'__format__'

,'__ge__'

,'__get__'

,'__getattribute__'

,'__globals__'

,'__gt__'

,'__hash__'

,'__init__'

,'__init_subclass__'

,'__kwdefaults__'

,'__le__'

,'__lt__'

,'__module__'

,'__name__'

,'__ne__'

,'__new__'

,'__qualname__'

,'__reduce__'

,'__reduce_ex__'

,'__repr__'

,'__setattr__'

,'__sizeof__'

,'__str__'

,'__subclasshook__'

]

print

(myfunc.__code__)

#

上面的輸出結果已經指明了__code__也是物件,在這個函式物件裡,我們可以看到位元組碼,元數(也就是引數數量)和一些與函式相關的其他東西。

print

(dir

(myfunc.__code__)

)# [... , 'co_argcount', 'co_cellvars', 'co_code', 'co_consts', 'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars', 'co_kwonlyargcount', 'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize', 'co_varnames']

現在就可以看到函式物件相關的屬性,其中有一類屬性都以co_開頭,表示位元組碼的意思。實際上,並非只有函式具有這些屬性,所有的**塊(code block)都有這些屬性

def

myfunc

(a, b=2)

: a =

'hello'

b ='world'

# 列印這些以 co 開頭的屬性的值

for attr in

dir(myfunc.__code__)

:if attr.startswith(

'co_'):

print

(f': '

)# co_argcount: 2

# co_cellvars: ()

# co_code: b'd\x01}\x00d\x02}\x01d\x00s\x00'

# co_consts: (none, 'hello', 'world')

# co_filename: c:/users/administrator/desktop/demo.py

# co_firstlineno: 3

# co_flags: 67

# co_freevars: ()

# co_kwonlyargcount: 0

# co_lnotab: b'\x00\x01\x04\x01'

# co_name: myfunc

# co_names: ()

# co_nlocals: 2

# co_stacksize: 1

# co_varnames: ('a', 'b')

# 使用 dis 模組的 show_code() 函式來輸出這些資訊的整理

import dis

dis.show_code(myfunc)

# name: myfunc

# filename: c:/users/administrator/desktop/demo.py

# argument count: 2

# kw-only arguments: 0

# number of locals: 2

# stack size: 1

# flags: optimized, newlocals, nofree

# constants:

# 0: none

# 1: 'hello'

# 2: 'world'

# variable names:

# 0: a

# 1: b

研究__code__是了解 python 函式如何執行的最好辦法。例如,函式 foo 的元數是由foo.__code__.co_argcount獲得,而字碼節存在於foo.__code__.co_code

__code__物件的屬性是唯讀,但是__code__屬性本身不是!我們可以使用下面的**整蠱一下朋友

def

cat():

print

('i am a cat!'

)def

dog():

print

('i am a dog!'

)

cat.__code__ = dog.__code__

現在,當我們執行cat()時,實際上執行的是 dog 的**,於是我們會得到:

i am a dog!

自定義控制項及自定義屬性

自定義控制項在android開發中的重要性,是不言而喻,眾人皆知的。希望通過這二天的學習,能讓大家了解自定義控制項的原理,熟悉自定義控制項的使用步驟,並能寫出一些普通的效果。內容介紹 1 使用系統控制項,實現自定義的效果,案例有 優酷環形選單 廣告條 viewpager 下拉列表 spinner 2...

自定義組合控制項及自定義屬性

1 宣告乙個view物件繼承相對布局或線性布局或其他的viewgroup 2 在自定義的view物件裡面重寫它的構造方法,在構造方法裡面就把布局都初始化完畢 3 根據業務需求 新增一些api方法,擴充套件自定義的組合控制項 4 擴充套件自定義屬性 5 宣告自定義屬性的命名空間 xmlns andro...

Javascript中的函式及自定義屬性

1.函式 將一系列 或者操作行為打包到一起形成的內容就是函式,是一塊有特定功能的 2.函式的分類 a.具名函式 有函式名的就是具名函式 function foo foo 執行函式,表示函式執行成功了注 函式執行時需要加 也就是說,直接加括號表示函式執行了。on事件後面所賦值的內容一定是函式,而不是函...