最近學習了下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 宣告 ...