python中的元類(metaclass)
阿新 • • 發佈:2017-09-04
優先 裝飾器 target {} pass get tac 搜索 items
認識python中元類的準備工作。
1,首先需要明白一個概念就是python中一切皆為對象。
input: class Trick(object): pass print type(‘1234‘) print type(1234) print type(Trick()) output: <type ‘str‘> <type ‘int‘> <class ‘__main__.Trick‘>
2,什麽是新式類,舊式類
知乎上的這篇文章個人表示不錯,言簡意賅:https://www.zhihu.com/question/22475395
1)首先,寫法不一樣:
classA: pass class B(object): pass
2)在多繼承中,新式類采用廣度優先搜索,而舊式類是采用深度優先搜索。
3)新式類更符合OOP編程思想,統一了python中的類型機制。
3,type(類名, 父類的元組(針對繼承的情況,可以為空),包含屬性的字典(名稱和值)) 例子:type(‘trick‘, (), {})
下面開始進入主題:什麽是元類
元類就是創建類的類,心裏話工作中確實沒有用到過,可能因為沒有用到過才在想什麽是元類,真的用到過可能不會再問為什麽會有元類。
在stackoverflow看到的例子粘貼過來
函數做元類傳遞給類
input:def upper_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‘, (), {‘bar‘: 0}) print hasattr(pw, ‘bar‘) print hasattr(pw, ‘BAR‘) print pw.BAR output: False True 0
正式類來作為元類傳遞給__metaclass__
class UpperAttrMetaClass(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 = 12 money = ‘unlimited‘ print Trick.BAR print Trick.MONEY
為什麽要存在元類
元類的的目的:攔截類的創建,然後修改一些特性,然後返回該類。
就是感覺是裝飾器幹的事情,只是裝飾器是修飾一個函數,同樣是一個東西進去,然後被額外加了一些東西,最後被返回。
What is metaclass in Python http://stackoverflow.com/ques...
python中的元類(metaclass)