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事件後面所賦值的內容一定是函式,而不是函...