Python MetaClass元類解析

2021-10-01 12:26:49 字數 1772 閱讀 9877

最近學習了下metaclass元類的原理與使用,今天總結下,以備後用。

首先需要樹立乙個元類的概念。python中的類其實也是乙個物件,不過該物件擁有建立物件的能力。那麼普通的class就是從元類metaclass中來。

class objecttest(object):

pass

myobj = objecttest()

print myobj

<__main__.objectcreate object at 0x000000000341def0>

既然普通的類本質上是乙個物件,那麼也就能對該類進行類似物件的操作,比如建立、修改、傳遞引數等等。

建立類可以通過type函式,type的宣告如下:

def __init__(cls, what, bases=none, dict=none): # known special case of type.__init__

"""type(object) -> the object's type

type(name, bases, dict) -> a new type

# (copied from class doc)

"""pass

type(類名,基類(繼承,可以為空),屬性字典)

person = type("person",(),)

print person().name

當我們想要為類增加函式時,可以這樣寫

def add(cls,x,y):

return x+y

person = type("person",(),)

print hasattr(person,"add")

print person().add(1,2)

可以理解為python中所有的類都是通過元類進行建立的。

input:

print person().__class__.__class__

print int(5).__class__.__class__

print str("a").__class__.__class__

out:

類中有乙個__metaclass__屬性,每個類物件在建立時都會自下而上的去尋找__metaclass__,如果都沒有找到就會使用type建立類物件。

舉乙個很經典的例子,更改類屬性變數為大寫

input:

class person:

name ="vspiders"

age = 15

__metaclass__ = upper_class

def getage(self):

# age already change to age

return self.age

print hasattr(person,'age')

print hasattr(person,'age')

print hasattr(person,"getage")

print person().getage()

out:

false

true

false

15

其實__metaclass__的作用就是返回乙個新的修改後的class。

元類的主要作用在於:

1. 攔截類的建立

2. 修改類

3. 返回新類

參考:

類 友元函式 友元類

友元函式不是當前類的成員函式,但它可以訪問該類所有的成員,包括私有成員 保護成員和公有成員。在類中宣告友元函式時,需在其函式名前加上關鍵字 friend。友元函式既可以是非成員函式,也可以是另乙個類的成員函式。class date date date int y,int m,int d void s...

元類,自定製元類的內容

元類的概念 元類是類的類,是類的模板 元類是用來控制如何建立類的,正如類是建立物件的模板一樣 元類的例項是類,正如類的例項為物件 type是python的乙個內建元類,用來直接控制生成類,python中class定義的類其實都是type類例項化的物件 產生類的兩種方式 類的產生有兩種方式,這兩種方式...

友元(友元函式 友元類 類成員函式的友元)

friend 友元機制 允許乙個類將對其非公有成員的訪問許可權授予指定的函式或者類。我們可以將友元大致分為3類 友元函式 是指某些雖然不是類的成員函式,但是能夠訪問這個類的所有成員的函式。比如我們下列的 include class test friend void show test rhs 宣告 ...