1. 程式人生 > >python中的元類(metaclass)

python中的元類(metaclass)

優先 裝飾器 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)首先,寫法不一樣:

class
A: 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)