元類,自定製元類的內容

2021-09-25 10:31:50 字數 2576 閱讀 7543

元類的概念

元類是類的類,是類的模板

元類是用來控制如何建立類的,正如類是建立物件的模板一樣

元類的例項是類,正如類的例項為物件

type是python的乙個內建元類,用來直接控制生成類,python中class定義的類其實都是type類例項化的物件

產生類的兩種方式

類的產生有兩種方式,這兩種方式產生的類的本質是一樣的

class

foo:

x =1ffo =

type

("ffo",(

object,)

,)print

(foo)

print

(ffo)

如果乙個類沒有宣告自己的元類,預設它的元類就是type,除了使用type,使用者也可以通過繼承來自定義元類

class

foo:

def__init__

(self, name, age)

: self.name = name

self.age = age

x =1def

__init__

(self, name, age)

: self.name = name

self.age = age

ffo =

type

("ffo",(

object,)

,)#三個引數分別是 類名 、繼承的類(元組形式)、類內屬性

f1 = foo(

"mb",18

)f2 = ffo(

"cjj",18

)print

(f1)

print

(f2)

自定義元類

#metaclass的本質

class

foo(metaclass=

type):

# type("foo", (object,), {})

def__init__

(self, a, b, c)

: self.a = a

self.b = b

self.c = c

可以定義乙個新的元類,利用metaclass引數宣告元類

class

mytype

(type):

def__init__

(self, a, b, c)

:#需要四個引數

self.a = a

self.b = b

self.c = c

class

foo(metaclass=mytype)

:#這裡相當於foo = foo(self, "foo", (object,),{}) (這裡的self也是foo,因為賦值給了foo),相當於執行mytype的__init__()函式,相當於讓mytype產生乙個例項賦值給foo

def__init__

(self, name)

: self.name = name

p1 = foo(

"alex"

)#這裡的例項化相當於執行的mytype中預設的__call__()方法

print

(p1.name)

print

(foo)

print

(p1)

這裡使用foo產生例項相當於呼叫的元類的__call__()方法,所以想要定製元類還需要重寫元類的__call__()方法

class

mytype

(type):

def__init__

(self, a, b, c)

: self.a = a

self.b = b

self.c = c

def__call__

(self,

*args,

**kwargs)

: obj =

object

.__new__(self)

#這一步相當於產生乙個物件,這個物件中現在什麼都沒有,之後將這個物件中封裝屬性最終賦值給給定的變數

self.__init__(obj,

*args,

**kwargs)

#為了在例項化的時候自定執行類的__init__方法,需要在元類的__call__()方法中寫入執行__init__()方法

return obj

class

foo(metaclass=mytype)

:def

__init__

(self, name)

: self.name = name

p1 = foo(

"alex"

)print

(p1.name)

print

(foo)

print

(p1)

類 友元函式 友元類

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

自定義元類控制類的建立

chinese每次建立由原來的type改為mymeta,因此可以在mymeta內對類進行一些特殊定製 示例一 類名的大小寫強控 class mymeta type def init self,class name,class bases,class dic if not class name.ist...

python元類的使用 Python的元類如何使用

這次給大家帶來python的元類如何使用,使用python元類的注意事項有哪些,下面就是實戰案例,一起來看一下。今天我的任務就是徹底明白什麼是元類,一起看看。要搞懂元類,我們還是先從物件說起。python 一切皆物件,這句話你一定有聽說過 現在你就聽說了 乙個數字是物件,乙個字串是物件,乙個列表是物...