認識python中元類的準備工作。
1,首先需要明白乙個概念就是python中一切皆為物件。
input:class
trick(object):
pass
print type('
1234')
print type(1234)
type(trick())
output:
'str
'>
'int
'>
'__main__.trick
'>
2,什麼是新式類,舊式類
知乎上的這篇文章個人表示不錯,言簡意賅:
1)首先,寫法不一樣:
classa:
pass
class
b(object):
pass
2)在多繼承中,新式類採用廣度優先搜尋,而舊式類是採用深度優先搜尋。
3)新式類更符合oop程式設計思想,統一了python中的型別機制。
3,type(類名, 父類的元組(針對繼承的情況,可以為空),包含屬性的字典(名稱和值)) 例子:type('trick', (), {})
下面開始進入主題:什麼是元類
元類就是建立類的類,心裡話工作中確實沒有用到過,可能因為沒有用到過才在想什麼是元類,真的用到過可能不會再問為什麼會有元類。
在stackoverflow看到的例子貼上過來
函式做元類傳遞給類
input:defupper_attr(class_name, class_parents, class_attr):
"""返回乙個物件,將屬性都改為大寫的形式
:param class_name: 類的名稱
:param class_parents: 類的父類tuple
:param class_attr: 類的引數
:return: 返回類
"""#
生成了乙個generator
attrs = ((name, value) for name, value in class_attr.items() if
not name.startswith('__'
)) uppercase_attrs = dict((name.upper(), value) for name, value in
attrs)
return
type(class_name, class_parents, uppercase_attrs)
__metaclass__ =upper_attr
pw = upper_attr('
trick
', (), )
print hasattr(pw, '
bar'
)print hasattr(pw, '
bar'
pw.bar
output:
false
true
0
正式類來作為元類傳遞給__metaclass__
classupperattrmetaclass(type):
def__new__
(mcs, class_name, class_parents, class_attr):
attrs = ((name, value) for name, value in class_attr.items() if
not name.startswith('__'
)) uppercase_attrs = dict((name.upper(), value) for name, value in
attrs)
return super(upperattrmetaclass, mcs).__new__
(mcs, class_name, class_parents, uppercase_attrs)
class
trick(object):
__metaclass__ =upperattrmetaclass
bar = 12money = '
unlimited
trick.bar
print trick.money
為什麼要存在元類
元類的的目的:攔截類的建立,然後修改一些特性,然後返回該類。
就是感覺是裝飾器幹的事情,只是裝飾器是修飾乙個函式,同樣是乙個東西進去,然後被額外加了一些東西,最後被返回。
what is metaclass in python
python中的元類
python中的元類大家都可能比較很陌生,因為大家都聽說過99 的情況下是用不到元類的,但是大家對類確很了解,大家都知道在python中萬物皆物件,那麼python中的類是不是物件呢?物件的樣子 1,物件可以在程式中動態的進行建立,python的語言動態特性。2,物件可以通過 class 獲取該物件...
Python 中的元類
如果看完以後還是感覺莫名其妙,執行這樣乙個demo 可能會對你有所幫助 元類程式設計在我看來,如果你想開發一些框架,可以嘗試一下 class upperattrmetaclass type type dict def new cls,cls name,bases,attr dict news cls...
python中的元類
目錄其他 我們建立乙個類目的是為了建立該類的例項物件,而元類就是用來建立類的。換個理解方式就是,元類就是建立類的類。在python中可以使用type函式建立乙個類,參考 python中type的用法 用法如下 tpye name,bases,dict 實際上type 函式就是乙個元類,是python...