python中的元類(metaclass)

2022-07-17 23:54:15 字數 2403 閱讀 5869

認識python中元類的準備工作。

1,首先需要明白乙個概念就是python中一切皆為物件。

input:

class

trick(object):

pass

print type('

1234')

print type(1234)

print

type(trick())

output:

'str

'>

'int

'>

'__main__.trick

'>

2,什麼是新式類,舊式類

知乎上的這篇文章個人表示不錯,言簡意賅:

1)首先,寫法不一樣:

class

a:

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'

)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 = 12money = '

unlimited

'print

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...